使用=每行用于数据表

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)

  • @lmo具有自定义功能,最好只使用`dt [,a:= f(.SD),by = seq_len(nrow(dt))]` (3认同)
  • @Brandon感谢jangorecki,我添加了两行代码,用于按行处理自动滚动功能.可能速度很快,因此如果您正在处理具有数千万行的数据集,您应该考虑Frank的注释和señor-o s方法,并且可能会运行一些测试. (2认同)

Señ*_*r O 6

我认为一个更好的解决方案只是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)