在R中以“长格式”数据帧计算值

时间:2019-04-22 11:09:52

标签: r

我正在寻找一种在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)

说,我需要通过将ca相加来计算一个新类别b。通过以category作为键列将数据帧转换为“宽”格式,然后通过计算添加新的c变量并切换回“长”格式,非常容易做到。

但是,我要从数百个源项目中计算出数百个新类别,这将是一个非常耗时的解决方案。我敢肯定必须有一个更聪明的方法,但是我一直找不到。有任何想法吗?谢谢!

2 个答案:

答案 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相同,将使用aggregaterbind

rbind(df, transform(aggregate(value~index, df, sum), category = 'c'))