【发布时间】:2014-04-15 18:07:41
【问题描述】:
这里有两个人为但我希望我的问题的教学示例。
1) 运行此代码时:
> dat0 <- data.frame(A=c("a","a","b"), B="")
> data.table(dat0)[, lapply(.SD, function(x) length(A)) , by = "A"]
A B
1: a 1
2: b 1
我期待输出
A B
1: a 2
2: b 1
(类似于plyr::ddply(dat0, .(A), nrow))。
更新问题 1)
让我举一个不那么人为的例子。考虑以下数据框:
dat0 <- data.frame(A=c("a","a","b"), x=c(1,2,3), y=c(9,8,7))
> dat0
A x y
1 a 1 9
2 a 2 8
3 b 3 7
使用plyr包,我通过A的每个值得到x和y的方法如下:
> ddply(dat0, .(A), summarise, x=mean(x), y=mean(y))
A x y
1 a 1.5 8.5
2 b 3.0 7.0
非常好。现在想象另一个变量H 和以下计算:
dat0 <- data.frame(A=c("a","a","b"), H=c(0,1,-1), x=c(1,2,3), y=c(9,8,7))
> ddply(dat0, .(A), summarise, x=mean(x)^mean(H), y=mean(y)^mean(H))
A x y
1 a 1.2247449 2.9154759
2 b 0.3333333 0.1428571
也很好。 但是现在,假设您要计算大量变量x mean(x)^mean(H)。那我就不想打字了:
ddply(dat0, .(A), summarise, a=mean(a)^mean(H), b=mean(b)^mean(H), c=mean(c)^mean(H), d=mean(d)^mean(H), ...........)
所以我的想法是尝试:
flipcols <- my_selected_columns # c("a", "b", "c", "d", ....)
data.table(dat0)[, lapply(.SD, function(x) mean(x)^mean(H)), by = "A", .SDcols = flipcols]
但这不起作用,因为function(x) mean(x)^mean(H) 中的H 没有按我预期的那样处理!我也无法使其与plyr::colwise 一起使用。
2) 运行此代码时:
> dat0 <- data.frame(A=c("a","a","b"), B=1:3, c=0)
> data.table(dat0)[, lapply(.SD, function(x) B), .SDcols="c"]
Error in ..FUN(c) : object 'B' not found
我预计它会起作用并生成:
c
1: 1
2: 2
3: 3
那么有没有办法在转换中使用原始 data.table 的列?
【问题讨论】:
-
第二个例子你想做什么?将 B 的值赋给 c??
-
@RandyLai 当然,不。这个例子是人为的。问题是
function(x) B涉及B这是数据框的一列,你可以想象你想要的函数而不是这个愚蠢的函数。 -
但是
lapply适用于子集的列,为什么函数内部有B?请参阅我的答案进行比较。 -
@RandyLai 请看第一题更新
-
您对问题 (1) 的更新归结为您的 (2)。
标签: r data.table plyr