使用=每行用于数据表

时间:2016-04-22 20:01:38

标签: r data.table

我有一个数据表,我正在尝试创建一个新变量,它是所有其他列的函数。一个简单的例子是,如果我只想在所有行中求和或取平均值。例如:

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”列并按该列进行所有计算。这可能吗?

2 个答案:

答案 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