R 将单个变量分组,而将其余变量合并在一起。迭代不同的变量

R 将单个变量分组,而将其余变量合并在一起。迭代不同的变量,r,dataframe,group-by,dplyr,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 Variable X Y Z A 2 5 3 rest 17

假设我有一个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
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
使用dplyr或任何其他合适的包,我想按每个变量分组,将其与合并在一起的其余变量进行比较,并计算两个结果组之间的数学运算,比如说列的和。我会得到这样的结果:

Variable    X     Y     Z
A           2     5     3
B           4     3     2
C           5     1     5
B           6     2     4
C           2     5     2
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,因此我也希望以迭代的方式进行。任何建议都会大有帮助。非常感谢您的光临。

您有什么要说的吗?(您可以从列表中选择子集)


如果您想完全使用
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
库(tidyverse)
df%
汇总每个变量(funs(sum),~-变量)%>%
重命名(.dots=setNames(c(“组”)、c(“变量”))
}
映射(唯一(df$变量),~group_摘要(df,.x))
[[1]]
#一个tibble:2×4
变量X Y Z
1 A 2 5 3
2其余17 11 13
[[2]]
#一个tibble:2×4
变量X Y Z
1 B 10 5 6
2其余9 11 10
[[3]]
#一个tibble:2×4
变量X Y Z
1 C 7 6 7
2其余12 10 9

如果您想要不同于列表的输出,您可以探索不同映射函数的使用(例如
map_df
)和
tibbles

非常感谢@joel.wilson。我可以问你“x”代表什么吗?。我在colSums中遇到一个错误-->“x”必须是numeric@Lucas除了您指定的变量外,您的数据还有其他变量吗?那么它可能会出错。。我可以解决that@Lucas还要确保
df
data.frame
Yes@joel.wilson,正如我提到的,我有一个包含数百个变量的big data.frame。我有3列变量(v1、v2、v3),但我想根据特定列的变量(例如v1)对它们进行分组。许多的thanks@Lucas我编辑过。基本上我只选了那3个专栏非常感谢你@Jake Kaupp。请问“.x”代表什么?它是
purrr::map()
中使用的方法的一部分。在上面的调用中,
unique(df$Variable)
是将应用于
group\u summary()
的项目列表。
.x
是对该列表的明确引用。非常感谢@Jake Kaupp。你的解决方案非常有效。我把绿色支票给了joel.wilson,因为他先发布了一个解决方案。你应该这么做!我只是强调了一种不同的方法。嘿@JakeKaupp仔细检查了代码!!写得真棒。。我总是喜欢
tidyverse
approach+1