繁体   English   中英

使用lapply和ddply函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM