这是两个人为但我希望我的问题的教学例子。
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)
类似)。
让我举一个不那么人为的例子。请考虑以下数据框:
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
包,我按x
的每个值获得y
和A
的均值,如下所示:
> 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]
但这不起作用,因为H
中function(x) mean(x)^mean(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的列?
答案 0 :(得分:4)
1)使用.N
。分组变量A
的长度为1,因为每个组只有一个A
值(这是分组的含义):
dt <- data.table(A=c("a","a","b"), B="")
dt[, .N, by = A]
# A N
#1: a 2
#2: b 1
(已更新1)这与2)相同。解决方法是不使用.SDcols
:
dt = data.table(A=c("a","a","b"), H=c(0,1,-1), x=c(1,2,3), y=c(9,8,7))
dt[, lapply(.SD[, !"H", with = F], function(x) mean(x) ^ mean(H)), by = A]
# A x y
#1: a 1.2247449 2.9154759
#2: b 0.3333333 0.1428571
2)这是在此之前报告过的错误:https://r-forge.r-project.org/tracker/index.php?func=detail&aid=5222&group_id=240&atid=975
答案 1 :(得分:1)
我不知道我是否理解正确。
1)
library(data.table)
dat0 <- data.frame(A=c("a","a","b"), B="")
data.table(dat0)[, list(l= nrow(.SD)) , by = "A"]
结果:
A l
1: a 2
2: b 1
2)
dat0 <- data.frame(A=c("a","a","b"), B=1:3, c=0)
data.table(dat0)[, list(c=unlist(.SD)), .SDcols= "B"]
结果:
c
1: 1
2: 2
3: 3
1')
修改:我将-1
更改为mycols
dat0 <- data.frame(A=c("a","a","b"), H=c(0,1,-1), x=c(1,2,3), y=c(9,8,7))
mycols = c("x", "y")
data.table(dat0)[, lapply(.SD[,mycols,with=F], function(x) mean(x)^mean(H)) ,by = "A", .SDcols = c("H", mycols)]
结果:
A u v
1: a 1.2247449 2.9154759
2: b 0.3333333 0.1428571