使用每行的多个参数在数据帧的每一行上调用类似apply的函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我想调用的实际功能不是一个简单的总和,但它是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到原始数据的子集。

 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) )

或者如果你的函数只是使用矢量化版本:

rowSums(dat[,c('x','z')])
[1] 6 8

如果你想使用 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']))
用户回答回答于

data.frame是一个list,所以......

对于量化的功能 do.call通常是一个不错的选择。但是争论的名称起到了作用。这里testFunc用ar和x来代替a和b。在...允许无关的参数传递给没有导致错误进行传递:

do.call( function(x,z,...) testFunc(x,z), df )

对于非矢量化的函数mapply将会起作用,但是您需要匹配参数的排序或明确命名它们:

mapply(testFunc, df$x, df$z)

有时apply会起作用 - 因为所有的参数都是相同的类型,所以强制data.frame转换为矩阵不会通过更改数据类型导致问题。你的例子就是这样的。

如果你的函数要在所有参数全部通过的另一个函数中调用,那么比这些函数有更多的闪烁方法。研究lm()如果你想要走这条路线的身体的第一线。

扫码关注云+社区