我有一个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))
提前致谢!
你可以把它们包括在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
下最快的方法。
正如其他人所指出的那样,summarize
只返回分组变量和summarize
中指定的变量。这是设计的 - summarize
为每个组返回一行,因此每个变量必须有一个值。
summarize
中使用的函数必须返回单个值(因此覆盖),而使用group_by
和变量确保这些变量在组内是相同的。但对于其他变量,组内可能有几个不同的值:summarize
会选择哪个?它没有做出猜测,而是放弃了这些变量。
有几种方法可以解决这个问题,哪一个最好取决于您的数据以及您想要用它做什么:
city
进行分组但希望保留state
变量,则使用group_by(city, state)
将以与group_by(city)
相同的方式分组,因为城市和州是相互关联的(例如,“波士顿”将始终是与“MA”)。summarize
中定义它们,并仅选择第一个值作为该组的值,如@thc's answer中所示。请注意,您将丢失这些变量的任何其他值,并且不总是清楚保留哪个值以及哪个值将丢失。mutate
代替 - 这将保留原始行数而不是每组折叠为1,但将确保您不会丢失任何数据。A = paste(A, sep = ', ')
添加到summarize
中,为每个要保留的变量将它们作为逗号(或其他)分隔的字符串加入。这将保留信息,但代价是在将来的任何步骤中都难以使用。