[英]Use the lapply and ddply functions
我试图将ddply用于示例数据(调用Z),如下所示:
id y
1001 10
1001 11
1200 12
2001 10
2030 12
2100 32
3100 10
3190 13
4100 45
5100 67
5670 56
...
10001 54
10345 45
11234 32
and so on
我的目的是找到以1(即1001,1200,..),2(2100),3(3100,3190),4,... 10,11,... 65开头的id的y之和。 例如,对于以1开头的id,总和为10 + 11 + 12 = 33,对于以2开头的id,其总和为32。
我想使用apply函数,如下所示:
>s <- split(z,z$id)
>lapply(s, function(x) colSums(x[, c("y")]))
但是,这给了我每个唯一ID的总和,而不是我一直在寻找的那个ID。 在这方面的任何建议将不胜感激。
这是一个使用%/%
进行整数除法的data.table
解决方案(返回几千)
library(data.table)
DT <- data.table(z)
x <- DT[,list(sum_y = sum(y)), by = list(id = id %/% 1000)]
x
id sum_y
1: 1 33
2: 2 54
3: 3 23
4: 4 45
5: 5 123
6: 10 99
你可以用ddply
做类似的ddply
ddply(z, .(id = id %/% 1000 ), summarize, sum_y = sum(y))
id sum_y
1 1 33
2 2 54
3 3 23
4 4 45
5 5 123
6 10 99
这会给您想要的答案吗?
z <- read.table(textConnection("id y
1001 10
1001 11
1200 12
2001 10
2030 12
2100 32
3100 10
3190 13
4100 45
5100 67
5670 56
10001 54
10345 45"),header=TRUE)
result <- tapply(
z$y,
as.numeric(substr(z$id,1,nchar(z$id)-3)),
sum
)
result
1 2 3 4 5 10
33 54 23 45 123 99
要从上方窃取@mnel的行,可以将其简化为:
result <- tapply(
z$y,
z$id %/% 1000,
sum
)
thelatemail提供了一种有效的方法,但我想指出的问题并不是您对lapply
的理解(您的代码几乎是正确的),而是考虑了分组。 thelatemail在他的解决方案中做到了这一点,这就是关键。 我将向您展示您的方法,然后介绍如何实际使用此方法,然后仅由于我从未使用过它而使用ave
:)
读入数据
z <- read.table(textConnection("id y #stole this from the latemail
1001 10
1001 11
1200 12
2001 10
2030 12
2100 32
3100 10
3190 13
4100 45
5100 67
5670 56
10001 54
10345 45"),header=TRUE)
您的代码已调整
s <- split(z, substring(as.character(z$id), 1, nchar(as.character(z$id)) - 3))
lapply(s, function(x) sum(x[, "y"]))
我可能会采用的方法; 添加一个新的因子id变量
z$IDgroup <- substring(as.character(z$id), 1, nchar(as.character(z$id)) - 3)
aggregate(y ~ IDgroup, z, sum)
#similar approach but adds the solution back as a new column
z$group.sum <- ave(z$y, z$IDgroup, FUN=sum)
z
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.