Bra*_*don 11 r data.table
我有一个数据表,我正在尝试创建一个新变量,它是所有其他列的函数.一个简单的例子是,如果我只想在所有行中求和或取平均值.例如:
dt <- data.table(a = 1:9, b = seq(10,90,10), c = seq(11:19), d = seq(100, 900, 100))
Run Code Online (Sandbox Code Playgroud)
我想创建一个矢量/列,它只是所有列的平均值.我想到的语法看起来像这样:
dt[, average := mean(.SD)]
Run Code Online (Sandbox Code Playgroud)
然而,这总结了整个事情.我知道我也可以这样做:
dt[, average := lapply(.SD, mean)]
Run Code Online (Sandbox Code Playgroud)
但这会产生单行结果.我基本上寻找相当于:
dt[, average := lapply(.SD, mean), by = all]
Run Code Online (Sandbox Code Playgroud)
这样它只是为所有行计算这个,而不必创建一个"id"列并按该列进行所有计算.这可能吗?
lmo*_*lmo 11
以下data.table代码对我有用.
dt[, average := rowMeans(.SD)]
Run Code Online (Sandbox Code Playgroud)
正如@jangorecki所指出的,只要你记住每一行都是一个列表对象,就可以构造你自己的行来运行.
# my function, must unlist the argument
myMean <- function(i, ...) mean(unlist(i), ...)
Run Code Online (Sandbox Code Playgroud)
运用 by=seq_len
dt[, averageNew := myMean(.SD), by = seq_len(nrow(dt))]
Run Code Online (Sandbox Code Playgroud)
运用 row.names
dt[, averageOther := myMean(.SD), by = row.names(dt)]
Run Code Online (Sandbox Code Playgroud)
我认为一个更好的解决方案只是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
Run Code Online (Sandbox Code Playgroud)