微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

plyr 用于不同子集的相同分析 更新

如何解决plyr 用于不同子集的相同分析 更新

我是 plyrdplyr 的新手,真的不明白。我已经设法解决了一些功能,但我在处理非常基本的东西时遇到了困难,例如以下示例。

mtcars为例,我有不同的重叠子集,例如vs = 1am = 1

我现在想运行相同的分析,在这种情况下,median() 用于针对不同子集的一个变量,以及另一个分析,例如 mean() 用于另一个变量。 这最终应该给我相同的结果,例如以下代码 - 只是更短:

data_mt <- mtcars         # has binary dummy vars for grouping
data_vs <- data_mt[ which(data_mt$vs == 1 ),]
data_am <- data_mt[ which(data_mt$am == 1 ),]

median(data_mt$mpg)
median(data_vs$mpg)
median(data_am$mpg)

mean(data_mt$cyl)
mean(data_vs$cyl)
mean(data_am$cyl)

在我的真实示例中,我有一个 data_mt 的类比,所以如果你有一个从那里开始的解决方案,没有 data_vs 等,那就太好了。

我确定这是非常基本的,但我无法理解它 - 因为我有大约 1500 个变量要查看,非常感谢您的帮助 =)

很可能我的答案已经在那里了,但是我知道我没有找到它为傻瓜解释的术语;D


编辑:

为了更好地了解我在做什么以及我在寻找什么,我特此发布我的原始代码(不是 mtcars 示例)。

我有一个数据集 ds,其中包含 553 个变量的 402 个观察值 该数据集来自一项对人类参与者的研究,其中一些参与者选择了额外的研究 mysobs 或两者兼而有之。

ds$mys <- 0
ds$mys[ which(ds$staffmystery_p == "Yes" ) ] <- 1

ds$obs <- 0
ds$obs[ which( !is.na(ds$sales_time)) ] <- 1

这 553 个变量要么是整数(例如年龄或经验年数),要么是因子(例如性别或是/否答案)。我现在想将完整数据集的一些描述与子集的描述进行比较,理想情况下还要对差异进行 t 检验。 目前我只有一个很长的代码列表,它们或多或少地像下面这样(只是更长)。这不包括 t 检验。

describe(ds$age_b)
describe(dm$age_b)
describe(do$age_b)

prop.table(table(ds$sex_b))*100
prop.table(table(dm$sex_b))*100
prop.table(table(do$sex_b))*100

dsdmdo 是不同的数据集,但它们都只是基于上面提到的完整数据集ds 和子集ds$mys for dmds$obs 用于 do

describe 来自 psych 包,只列出了描述性统计数据,如均值或中位数等。我不需要所有的指标,主要是 n、均值、中位数、sd 和 iqr。 “prop.table”周围的公式为我提供了一个读数,我可以将其复制到我用于最终出版物的 excel 表中。我不想要自动输出,因为我一直被要求添加或更改它,这在 excel 中确实比自动输出更容易。 (除非你知道一个更好的方法;)

非常感谢!

解决方法

如果我们想按组对不同的列分别执行此操作,这是一个选项

library(dplyr)
library(purrr)
library(stringr)
map_dfc(c('vs','am'),~ 
   mtcars %>% 
     group_by(across(all_of(.x))) %>%
     summarise(!! str_c("Mean_cyl_",.x)  := mean(cyl),!! str_c("Median_mpg_",.x) := median(mpg),.groups = 'drop'))%>%
   mutate(Mean_cyl_full = mean(mtcars$cyl),Median_mpg_full = median(mtcars$mpg))

-输出

# A tibble: 2 x 8
#     vs Mean_cyl_vs Median_mpg_vs    am Mean_cyl_am Median_mpg_am Mean_cyl_full Median_mpg_full
#  <dbl>       <dbl>         <dbl> <dbl>       <dbl>         <dbl>         <dbl>           <dbl>
#1     0        7.44          15.6     0        6.95          17.3          6.19            19.2
#2     1        4.57          22.8     1        5.08          22.8          6.19            19.2

如果包版本旧,我们可以用across替换group_by_at

map_dfc(c('vs',~ 
   mtcars %>% 
     group_by_at(vars(.x)) %>%
     summarise(!! str_c("Mean_cyl_",Median_mpg_full = median(mtcars$mpg))

更新

基于更新,我们可以将数据集放在list中,立即进行转换并return一个list的描述性统计和比例表

out <- map(dplyr::lst(dm,ds,do),~ {

          dat <- .x %>%
                     mutate(mys = as.integer(staffmystery_p == 'Yes'),obs = as.integer(!is.na(sales_time)))
                            age_b_desc <- describe(dat$age_b)
                            prop_table_out <- prop.table(table(dat$sex_b))*100
                            
                            return(dplyr::lst(age_b_desc,prop_table_out))
                            
                            
                            }
                                    
                 )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。