我正在寻找一种在LONG格式数据帧中计算值而不在长格式和宽格式之间切换的方法。数据帧的结构基本上是这样的:
index <- rep(seq(1:3),2)
category <- c("a","a","a","b","b","b")
value <- c(3,6,8,9,7,4)
df <- data.frame(index, category,value, stringsAsFactors = FALSE)
说,我需要通过将c
和a
相加来计算一个新类别b
。通过以category
作为键列将数据帧转换为“宽”格式,然后通过计算添加新的c
变量并切换回“长”格式,非常容易做到。
但是,我要从数百个源项目中计算出数百个新类别,这将是一个非常耗时的解决方案。我敢肯定必须有一个更聪明的方法,但是我一直找不到。有任何想法吗?谢谢!
答案 0 :(得分:2)
我们可以使用data.table
library(data.table)
rbind(setDT(df), df[, .(category = 'c', value = sum(value)), index])
# index category value
#1: 1 a 3
#2: 2 a 6
#3: 3 a 8
#4: 1 b 9
#5: 2 b 7
#6: 3 b 4
#7: 1 c 12
#8: 2 c 13
#9: 3 c 12
答案 1 :(得分:1)
使用dplyr
,我们可以group_by
index
来匹配每个组的值sum
values
并将行绑定到原始数据帧。
library(dplyr)
bind_rows(df, df %>%
group_by(index) %>%
summarise(category = 'c',
value = sum(value)))
# index category value
#1 1 a 3
#2 2 a 6
#3 3 a 8
#4 1 b 9
#5 2 b 7
#6 3 b 4
#7 1 c 12
#8 2 c 13
#9 3 c 12
与基数R相同,将使用aggregate
和rbind
rbind(df, transform(aggregate(value~index, df, sum), category = 'c'))