为什么在dplyr包中选择的变量不在R的输出df中?

问题描述 投票:1回答:2

我有一个30列和2000行的df。

从df中,我通过名称选择了几个变量,并通过3行3组和类型变量计算了Value的平均值。

但是输出数据中只有3个变量(group,type,res)。

如何将所选变量保存到输出df中?这段代码有什么问题吗?

output <- data %>%
  select(group, type, A, B, C, Value)  %>%
  group_by(group = gl(n()/3, 3), type) %>%
  summarise(res = mean(Value))

提前致谢!

r select dplyr output
2个回答
1
投票

你可以把它们包括在summarise中,例如:

output <- data %>%
  select(group, type, A, B, C, Value) %>%
  group_by(group = gl(n()/3, 3), type) %>%
  summarise(res = mean(Value), A=A[1], B=B[1], C=C[1] )

我相信如果你有一个非常大的data.frame,这是dplyr下最快的方法。


2
投票

正如其他人所指出的那样,summarize只返回分组变量和summarize中指定的变量。这是设计的 - summarize为每个组返回一行,因此每个变量必须有一个值。

summarize中使用的函数必须返回单个值(因此覆盖),而使用group_by和变量确保这些变量在组内是相同的。但对于其他变量,组内可能有几个不同的值:summarize会选择哪个?它没有做出猜测,而是放弃了这些变量。

有几种方法可以解决这个问题,哪一个最好取决于您的数据以及您想要用它做什么:

  1. 将这些变量添加为分组变量。这是首选方法,但显然只有在数据结构允许的情况下才有效。例如,在假设数据集中,如果您想按city进行分组但希望保留state变量,则使用group_by(city, state)将以与group_by(city)相同的方式分组,因为城市和州是相互关联的(例如,“波士顿”将始终是与“MA”)。
  2. summarize中定义它们,并仅选择第一个值作为该组的值,如@thc's answer中所示。请注意,您将丢失这些变量的任何其他值,并且不总是清楚保留哪个值以及哪个值将丢失。
  3. 使用mutate代替 - 这将保留原始行数而不是每组折叠为1,但将确保您不会丢失任何数据。
  4. 通过将A = paste(A, sep = ', ')添加到summarize中,为每个要保留的变量将它们作为逗号(或其他)分隔的字符串加入。这将保留信息,但代价是在将来的任何步骤中都难以使用。
© www.soinside.com 2019 - 2024. All rights reserved.