首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用来自每行的多个参数对数据帧的每一行调用类似apply的函数

使用来自每行的多个参数对数据帧的每一行调用类似apply的函数
EN

Stack Overflow用户
提问于 2013-02-25 10:09:32
回答 12查看 287.9K关注 0票数 184

我有一个包含多列的数据帧。对于数据帧中的每一行,我想在该行上调用一个函数,该函数的输入使用该行中的多个列。例如,假设我有这个数据和这个接受两个参数的testFunc:

代码语言:javascript
复制
> 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函数族?

我试过这个:

代码语言:javascript
复制
> 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

但是弄错了,有什么想法吗?

编辑:我要调用的实际函数不是一个简单的sum,而是power.t.test。我使用a+b只是为了举例说明。最终目标是能够做这样的事情(用伪代码编写):

代码语言:javascript
复制
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的输出向量。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-02-25 10:18:02

您可以将apply应用于原始数据的子集。

代码语言:javascript
复制
 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,请使用矢量化版本:

代码语言:javascript
复制
rowSums(dat[,c('x','z')])
[1] 6 8

如果您想使用testFunc

代码语言:javascript
复制
 testFunc <- function(a, b) a + b
 apply(dat[,c('x','z')], 1, function(x) testFunc(x[1],x[2]))

编辑要按名称而不是按索引访问列,您可以执行以下操作:

代码语言:javascript
复制
 testFunc <- function(a, b) a + b
 apply(dat[,c('x','z')], 1, function(y) testFunc(y['z'],y['x']))
票数 149
EN

Stack Overflow用户

发布于 2013-02-25 10:47:39

data.framelist,所以..。

对于矢量化函数, do.call通常是一个很好的选择。但是参数的名称起作用了。这里使用参数x和y而不是a和b来调用testFunc...允许传递不相关的参数而不会导致错误:

代码语言:javascript
复制
do.call( function(x,z,...) testFunc(x,z), df )

对于非矢量化函数mapply将起作用,但您需要匹配arg的顺序或显式命名它们:

代码语言:javascript
复制
mapply(testFunc, df$x, df$z)

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

如果您的函数是在另一个函数中调用的,并且所有参数都传递到该函数中,那么有一个比这些方法更巧妙的方法。如果您想走这条路,请研究lm()主体的前几行。

票数 114
EN

Stack Overflow用户

发布于 2013-02-25 10:31:05

使用mapply

代码语言:javascript
复制
> 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
> mapply(function(x,y) x+y, df$x, df$z)
[1] 6 8

> cbind(df,f = mapply(function(x,y) x+y, df$x, df$z) )
  x y z f
1 1 3 5 6
2 2 4 6 8
票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15059076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档