对 R 中不断变化的数据框的某些值求和
Sum certain values from changing dataframe in R
我有一个数据框,我想通过添加某些值来聚合它。假设我有六个集群。然后,我将来自每个集群的数据输入某个函数,该函数生成一个值 x,然后将其放入输出数据框中。
cluster year lambda v e x
1 1 1 -0.12160997 -0.31105287 -0.253391178 15
2 1 2 -0.12160997 -1.06313732 -0.300349972 10
3 1 3 -0.12160997 -0.06704185 0.754397069 40
4 2 1 -0.07378295 -0.31105287 -1.331764904 4
5 2 2 -0.07378295 -1.06313732 0.279413039 19
6 2 3 -0.07378295 -0.06704185 -0.004581941 23
7 3 1 -0.02809310 -0.31105287 0.239647063 28
8 3 2 -0.02809310 -1.06313732 1.284568047 38
9 3 3 -0.02809310 -0.06704185 -0.294881283 18
10 4 1 0.33479251 -0.31105287 -0.480496125 15
11 4 2 0.33479251 -1.06313732 -0.380251626 12
12 4 3 0.33479251 -0.06704185 -0.078851036 34
13 5 1 0.27953088 -0.31105287 1.435456851 100
14 5 2 0.27953088 -1.06313732 -0.795435607 0
15 5 3 0.27953088 -0.06704185 -0.166848530 0
16 6 1 0.29409366 -0.31105287 0.126647655 44
17 6 2 0.29409366 -1.06313732 0.162961658 18
18 6 3 0.29409366 -0.06704185 -0.812316265 13
为了汇总,然后我将所有三年中集群 1 的 x 值与 seroconv.cluster1=sum(data.all[c(1:3),6])
相加,然后对每个集群重复。
每次我现在更改集群的数量时,我都必须手动更改 x 的添加。我希望能够说 n.vec <- seq(6, 12, by=2)
并将 n.vec 馈入函数并获取 x 并让 R 每次随着簇数的变化将每个簇的 x 值相加。所以它会做 6 个集群并将每个集群的所有 x 相加。然后 8 加上 x 等等。
您似乎在寻求一种简单的方法来拆分数据,应用一个函数(在本例中为求和),然后将它们重新组合在一起。 Split apply combine是一种常见的数据策略,R中有几种split/apply/combine策略,最流行的是base中的ave
,dplyr
包和data.table
包。
这是您使用 dplyr
的数据示例:
library(dplyr)
df %>% group_by(cluster, year) %>% summarise_each(funs(sum))
要获取每个簇的 x
的总和作为向量,您可以使用 tapply
:
tapply(df$x, df$cluster, sum)
# 1 2 3 4 5 6
# 65 46 84 61 100 75
如果您想输出为数据框,您可以使用 aggregate
:
aggregate(x~cluster, sum, data=df)
# cluster x
# 1 1 65
# 2 2 46
# 3 3 84
# 4 4 61
# 5 5 100
# 6 6 75
我有一个数据框,我想通过添加某些值来聚合它。假设我有六个集群。然后,我将来自每个集群的数据输入某个函数,该函数生成一个值 x,然后将其放入输出数据框中。
cluster year lambda v e x
1 1 1 -0.12160997 -0.31105287 -0.253391178 15
2 1 2 -0.12160997 -1.06313732 -0.300349972 10
3 1 3 -0.12160997 -0.06704185 0.754397069 40
4 2 1 -0.07378295 -0.31105287 -1.331764904 4
5 2 2 -0.07378295 -1.06313732 0.279413039 19
6 2 3 -0.07378295 -0.06704185 -0.004581941 23
7 3 1 -0.02809310 -0.31105287 0.239647063 28
8 3 2 -0.02809310 -1.06313732 1.284568047 38
9 3 3 -0.02809310 -0.06704185 -0.294881283 18
10 4 1 0.33479251 -0.31105287 -0.480496125 15
11 4 2 0.33479251 -1.06313732 -0.380251626 12
12 4 3 0.33479251 -0.06704185 -0.078851036 34
13 5 1 0.27953088 -0.31105287 1.435456851 100
14 5 2 0.27953088 -1.06313732 -0.795435607 0
15 5 3 0.27953088 -0.06704185 -0.166848530 0
16 6 1 0.29409366 -0.31105287 0.126647655 44
17 6 2 0.29409366 -1.06313732 0.162961658 18
18 6 3 0.29409366 -0.06704185 -0.812316265 13
为了汇总,然后我将所有三年中集群 1 的 x 值与 seroconv.cluster1=sum(data.all[c(1:3),6])
相加,然后对每个集群重复。
每次我现在更改集群的数量时,我都必须手动更改 x 的添加。我希望能够说 n.vec <- seq(6, 12, by=2)
并将 n.vec 馈入函数并获取 x 并让 R 每次随着簇数的变化将每个簇的 x 值相加。所以它会做 6 个集群并将每个集群的所有 x 相加。然后 8 加上 x 等等。
您似乎在寻求一种简单的方法来拆分数据,应用一个函数(在本例中为求和),然后将它们重新组合在一起。 Split apply combine是一种常见的数据策略,R中有几种split/apply/combine策略,最流行的是base中的ave
,dplyr
包和data.table
包。
这是您使用 dplyr
的数据示例:
library(dplyr)
df %>% group_by(cluster, year) %>% summarise_each(funs(sum))
要获取每个簇的 x
的总和作为向量,您可以使用 tapply
:
tapply(df$x, df$cluster, sum)
# 1 2 3 4 5 6
# 65 46 84 61 100 75
如果您想输出为数据框,您可以使用 aggregate
:
aggregate(x~cluster, sum, data=df)
# cluster x
# 1 1 65
# 2 2 46
# 3 3 84
# 4 4 61
# 5 5 100
# 6 6 75