为了账号安全,请及时绑定邮箱和手机立即绑定

在数据框的每一行上调用类似应用的函数,每一行具有多个参数

在数据框的每一行上调用类似应用的函数,每一行具有多个参数

潇潇雨雨 2019-10-24 13:50:56
我有一个多列的数据框。对于数据框中的每一行,我想在该行上调用一个函数,并且该函数的输入正在使用该行中的多个列。例如,假设我有此数据和接受两个参数的testFunc:> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))> df  x y z1 1 3 52 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 z1 1 52 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输出的向量。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您可以将其应用于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']))


查看完整回答
反对 回复 2019-10-24
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

dplyr套餐的新答案

如果要应用的功能是矢量化的,则可以使用软件包中的mutate功能dplyr:


> library(dplyr)

> myf <- function(tens, ones) { 10 * tens + ones }

> x <- data.frame(hundreds = 7:9, tens = 1:3, ones = 4:6)

> mutate(x, value = myf(tens, ones))

  hundreds tens ones value

1        7    1    4    14

2        8    2    5    25

3        9    3    6    36

plyr包装的旧答案

我认为,最适合该任务的工具mdply来自plyr包装。


例:


> library(plyr)

> x <- data.frame(tens = 1:3, ones = 4:6)

> mdply(x, function(tens, ones) { 10 * tens + ones })

  tens ones V1

1    1    4 14

2    2    5 25

3    3    6 36

不幸的是,正如Bertjan Broeksema指出的那样,如果您没有在mdply调用中使用数据帧的所有列,则此方法将失败。例如,


> library(plyr)

> x <- data.frame(hundreds = 7:9, tens = 1:3, ones = 4:6)

> mdply(x, function(tens, ones) { 10 * tens + ones })

Error in (function (tens, ones)  : unused argument (hundreds = 7)


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 792 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信