修改所选变量的 dplyr 输出

modifying the dplyr output for selected variables

我必须根据 cat1 组计算 varb 中每个变量的频率、均值和标准偏差。下面的代码可以正常工作。

# Random generation of values for categorical data
set.seed(33)
df <- data.frame(cat1 = sample( LETTERS[1:2], 100, replace=TRUE ), 
                cat2 = sample( LETTERS[3:5], 100, replace=TRUE ),
                cat3 = sample( LETTERS[2:4], 100, replace=TRUE ),
                con1 = runif(100,0,100),
                con2 = runif(100,23,45),
                con3 = runif(100,55,100),
                con4 = runif(100,12,49))

# Introducing null values 
df$con1[c(23,53,92)] <- NA
df$con2[c(33,46)] <- NA
df$con3[c(59,72)] <- NA
df$con4[c(33,46)] <- NA

# Selecting the variables of interest
varb <- c("con1","con2","con3","con4")

# Calculating the stats
results <- df %>% group_by(cat1) %>% summarise_each(funs(count=sum(!is.na(.)),
                                                              mean(., na.rm = TRUE),
                                                              sd(., na.rm = TRUE)),
                                                         one_of(varb))
#Output    
> results
    Source: local data frame [2 x 13]

      cat1 con1_count con2_count con3_count con4_count con1_mean con2_mean con3_mean con4_mean  con1_sd  con2_sd  con3_sd  con4_sd
    1    A         50         51         50         51   45.0175  34.24199  77.95732  30.84059 29.41333 6.327222 13.13494 11.53573
    2    B         47         47         48         47   46.6868  33.30931  81.14928  28.14640 25.80322 6.909720 11.93321 10.04867

除了之前的 [=14] 之外,我还想对 varb2(属于 varbdf[which(df$cat2 == 'D'),] 子集数据的每个变量应用相同的函数=] 分组。下面的代码就是这样做的。

# Selecting the variables of interest
varb2 <- c("con2","con4")

# Calculating the stats
results2 <- df[which(df$cat2 == 'D'),] %>% group_by(cat1) %>% summarise_each(funs(count=sum(!is.na(.)),
                                                              mean(., na.rm = TRUE),
                                                              sd(., na.rm = TRUE)),
                                                         one_of(varb2))
# Output
results2
Source: local data frame [2 x 7]

  cat1 con2_count con4_count con2_mean con4_mean  con2_sd   con4_sd
1    A         13         13  36.08892  30.28429 7.172574 14.308223
2    B         13         13  31.83272  28.24502 6.497423  8.763573

我想用 varb2 中每个变量的新输出 results2 修改第一个输出 results。能否请您提供修改输出的建议,而不是删除varb2 来自 varb 来自任务 ?

# Expected Output
Source: local data frame [2 x 13]

  cat1 con1_count con2_count con3_count con4_count con1_mean con2_mean con3_mean con4_mean  con1_sd  con2_sd  con3_sd  con4_sd
1    A         50         13         50         13   45.0175  36.08892  77.95732  30.28429 29.41333 7.172574 13.13494 14.308223
2    B         47         13         48         13   46.6868  31.83272  81.14928  28.24502 25.80322 6.497423 11.93321 8.763573

创建一个新的数据框,在其中用 NA 替换您不想汇总的值。

df2 <- df
df2[df2$cat2!="D",varb2] <- NA
results3 <- df2 %>% 
    group_by(cat1) %>% 
    summarise_each(funs(count=sum(!is.na(.)),
                        mean(., na.rm = TRUE),
                        sd(., na.rm = TRUE)),
                   one_of(varb))

您可能还使用过以长格式重塑的数据。

library(reshape2)
results4 <- df %>% 
    melt(id = c("cat1","cat2","cat3")) %>%
    # con1 and con3, can have any values in cat2.
    # for con2 and con4, you only want 
    # to calculate the summary for values in cat2 == "D". 
    filter((!variable %in% varb2) |
               (variable %in% varb2 & cat2 == "D")) %>%
    group_by(cat1,variable) %>%
    summarise(count = sum(!is.na(value)),
              mean = mean(value, na.rm = TRUE),
              sd = sd(value, na.rm = TRUE))

# Which you could always reshape again
results4 %>% 
    rename(con = variable) %>%
    melt(id = c("cat1", "con")) %>%
    dcast(cat1 ~ con + variable)

tidyr包也可以reshape data,(我还没习惯)见R Studio data wrangling cheatsheet.