我有一个包含多列的数据框。对于数据框中的每一行,我想在该行上调用一个函数,并且该函数的输入使用该行中的多个列。例如,假设我有这个数据和这个接受两个参数的 testFunc:
> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6)) > df x y z 1 1 3 5 2 2 4 6 > testFunc <- function(a, b) a + b
假设我想将此 testFunc 应用于列 x 和 z。所以,对于第 1 行,我想要 1+5,对于第 2 行,我想要 2 + 6。有没有办法在不编写 for 循环的情况下做到这一点,也许使用 apply 函数系列?
我试过这个:
> df[,c('x','z')] x z 1 1 5 2 2 6 > lapply(df[,c('x','z')], testFunc) Error in a + b : 'b' is missing
但是有错误,有什么想法吗?
编辑: 我要调用的实际函数不是简单的求和,而是 power.t.test。我使用 a+b 只是为了举例。最终目标是能够做这样的事情(用伪代码编写):
df = data.frame( delta=c(delta_values), power=c(power_values), sig.level=c(sig.level_values) ) lapply(df, power.t.test(delta_from_each_row_of_df, power_from_each_row_of_df, sig.level_from_each_row_of_df ))
其中结果是每行 df 的 power.t.test 的输出向量。
您可以应用apply到原始数据的子集。
apply
dat <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6)) apply(dat[,c('x','z')], 1, function(x) sum(x) )
或者如果您的函数只是 sum 使用矢量化版本:
rowSums(dat[,c('x','z')]) [1] 6 8
如果你想使用testFunc
testFunc
testFunc <- function(a, b) a + b apply(dat[,c('x','z')], 1, function(x) testFunc(x[1],x[2]))
编辑 要按名称而不是索引访问列,您可以执行以下操作:
testFunc <- function(a, b) a + b apply(dat[,c('x','z')], 1, function(y) testFunc(y['z'],y['x']))