将单个变量与其他变量汇总在一起。迭代不同的变量

时间:2017-01-25 13:52:18

标签: r dataframe group-by dplyr

让我们说我有一个看起来像这样的data.frame:

Variable    X     Y     Z
A           2     5     3
B           4     3     2
C           5     1     5
B           6     2     4
C           2     5     2

使用dplyr或任何其他合适的包,我想按每个变量进行分组,将它与汇集在一起​​的其余变量进行比较,并计算两个结果组之间的数学运算,让我们说总和沿着列。我会得到这样的东西:

Variable    X     Y     Z
A           2     5     3
rest        17    11    13

Variable    X     Y     Z
B           10    5     6
rest        9     11    10

Variable    X     Y     Z
C           7     6     7
rest        12    10    9

我有一个包含数百个变量的大型data.frame,所以我也希望以迭代的方式进行。任何建议都会有很大帮助。非常感谢你提前。

2 个答案:

答案 0 :(得分:2)

这是什么东西? (您可以从列表中进行子集化)

l = lapply(unique(df$Variable), function(x) rbind(colSums(df[df$Variable == x,][c("X", "Y", "Z")]), 
                                                  colSums(df[df$Variable != x,][c("X", "Y", "Z")])))
#[[1]]
#      X  Y  Z
#[1,]  2  5  3
#[2,] 17 11 13

#[[2]]
#      X  Y  Z
#[1,] 10  5  6
#[2,]  9 11 10

#[[3]]
#      X  Y Z
#[1,]  7  6 7
#[2,] 12 10 9

names(l) = LETTERS[1:3]
l = lapply(l, function(x){rownames(x) = c("Variable", "Rest");x})
list2env(l, .Globalenv)  # this should load all dataframes separately

答案 1 :(得分:2)

如果你想要充实tidyverse

library(tidyverse)

df <- tibble(Variable = c("A","B","C","B","C"),
             X = c(2,4,5,6,2),
             Y = c(5,3,1,2,5),
             Z = c(3,2,5,4,2))


group_summary <- function(data, var) {

   data %>%
    group_by_(group = ~ if_else(grepl(var, Variable), var, "rest")) %>%
    summarise_each_(funs(sum),~-Variable) %>% 
    rename_(.dots = setNames(c("group"), c("Variable")))
}

map(unique(df$Variable), ~group_summary(df, .x))


[[1]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     A     2     5     3
2  rest    17    11    13

[[2]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     B    10     5     6
2  rest     9    11    10

[[3]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     C     7     6     7
2  rest    12    10     9

如果您想要一个不同于列表的输出,您可以探索使用不同的地图功能(例如map_df)和使用tibbles