R 使用人=数据表的每一行

R 使用人=数据表的每一行,r,data.table,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 := lapply(.SD, mean)] 但这会给出一个单行结果。我基本上是在寻找以下等价物: dt[, average :=

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

dt <- data.table(a = 1:9, b = seq(10,90,10), c = seq(11:19), d = seq(100, 900, 100))
然而,这总结了整件事。我知道我也能做到:

dt[, average := lapply(.SD, mean)] 
但这会给出一个单行结果。我基本上是在寻找以下等价物:

dt[, average := lapply(.SD, mean), by = all]

这样它就可以对所有行进行计算,而不必创建一个“id”列并按该列进行所有计算。这可能吗

我认为一个更好的解决方案就是使用
apply
,这是为类似行矩阵的操作而设计的,而as
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

下面的data.table代码适用于我

 dt[, average := rowMeans(.SD)]
正如@jangorecki所指出的,只要记住每一行都是一个列表对象,就可以构造自己的函数按行运行:

# my function, must unlist the argument
myMean <- function(i, ...) mean(unlist(i), ...)
使用
行名称

dt[, averageOther := myMean(.SD), by = row.names(dt)]

我认为通常的方法可能是
dt[,m:=Reduce(`+`,.SD)/length(.SD)]
。如果你在做行操作,也许你应该使用矩阵。很好,我会记住这个。不过,我实际上有一个我想要使用的自定义函数。在那种情况下有可能做类似的事情吗?例如:dt[,output:=myfunction(.SD)]对于自定义函数,您最好使用@señor-o s方法。@对于自定义函数,使用
dt[,a:=f(.SD),by=seq_len(nrow(dt))]
@jangorecki我不确定这是否总是有效:对于函数
myMean@Brandon,感谢jangorecki,我添加了两行代码,它们将按行处理自滚动函数。这可能会影响速度,因此,如果您正在处理数千万行的数据集,您应该考虑Frank的注释和señor-o方法,并可能运行一些测试。
dt[, averageNew := myMean(.SD), by = seq_len(nrow(dt))]
dt[, averageOther := myMean(.SD), by = row.names(dt)]