让我们说我有一个看起来像这样的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,所以我也希望以迭代的方式进行。任何建议都会有很大帮助。非常感谢你提前。
答案 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