我有一个数据表,我正在尝试创建一个新变量,它是所有其他列的函数。一个简单的例子是,如果我只想在所有行中求和或取平均值。例如:
dt <- data.table(a = 1:9, b = seq(10,90,10), c = seq(11:19), d = seq(100, 900, 100))
我想创建一个矢量/列,它只是所有列的平均值。我想到的语法看起来像这样:
dt[, average := mean(.SD)]
然而,这总结了整个事情。我知道我也可以这样做:
dt[, average := lapply(.SD, mean)]
但这会产生单行结果。我基本上在寻找相当于:
dt[, average := lapply(.SD, mean), by = all]
这样它只是为所有行计算这个,而不必创建一个“id”列并按该列进行所有计算。这可能吗?
答案 0 :(得分:11)
以下data.table代码对我有用。
dt[, average := rowMeans(.SD)]
正如@jangorecki所指出的那样,只要你记住每一行都是一个列表对象,就可以构造你自己的行来运行:
# my function, must unlist the argument
myMean <- function(i, ...) mean(unlist(i), ...)
使用by=seq_len
dt[, averageNew := myMean(.SD), by = seq_len(nrow(dt))]
使用row.names
dt[, averageOther := myMean(.SD), by = row.names(dt)]
答案 1 :(得分:5)
我认为一个更好的解决方案就是使用apply
来实现这一点,这是针对行式矩阵式操作而制作的,其中data.table
不是。
> dt$average = apply(dt, 1, mean)
> dt
a b c d average
1: 1 10 1 100 28
2: 2 20 2 200 56
3: 3 30 3 300 84
4: 4 40 4 400 112
5: 5 50 5 500 140
6: 6 60 6 600 168
7: 7 70 7 700 196
8: 8 80 8 800 224
9: 9 90 9 900 252