使用函数值之和多次应用参数

时间:2014-11-12 12:48:17

标签: r sum apply

我有一个非常大的数据帧...

v.l.df <- data.frame(seq(0, 10, 0.0001),seq(0, 10, 0.0001),seq(0, 10, 0.0001))

...以及带有一些if语句和计算的函数......

a.f <- function(cell_value,action){
  if(action == 1){
    cell_value * 1
  }

  else if(action == 2){
    cell_value * 5
  }
}

我现在想要将此函数逐行应用于v.l.df的前两列,并构建返回的总和。因此,新列应包含(伪代码):

new_col_1                                    new_col_2
a.f(v.l.df[1,1],1) + a.f(v.l.df[1,2],1)      a.f(v.l.df[1,1],2) + a.f(v.l.df[1,2],2)
a.f(v.l.df[2,1],1) + a.f(v.l.df[2,2],1)      a.f(v.l.df[2,1],2) + a.f(v.l.df[2,2],2)
...

如何实现这一目标?当使用apply时,我正在使用多个参数,并且返回值的总和构成了函数。

编辑:更改了示例功能。现在应该返回下面的

> a.f(2,1)
[1] 2
> a.f(2,2)
[1] 10

2 个答案:

答案 0 :(得分:0)

我会在几个步骤中完成此操作。您可以减少到更少的步骤,但我更喜欢让它更具可读性:

首先,将a.f应用于所有单元格两次,将action=1action=2应用于v.1.df的前两列(以传递{{1}内的附加参数},只需在定义apply之后放置它们:

FUN

然后action.1 = apply(v.1.df[,1:2], c(1,2), FUN = a.f, action=1) action.2 = apply(v.1.df[,1:2] ,c(1,2), FUN = a.f, action=2) 同时rowSumsaction.1,并将结果存储在同一action.2中:

data.frame

答案 1 :(得分:0)

我相信你的结果是通过以下方式实现的:

v.l.df$new_col_1 <- a.f(v.l.df$V1, 1) + a.f(v.l.df$V2, 1)
v.l.df$new_col_2 <- a.f(v.l.df$V1, 2) + a.f(v.l.df$V2, 2)

假设您的前两列分别命名为V1V2

您也可以定义另一个功能

a.f.2 <- function(val1, val2, method) {
    a.f(val1, method) + a.f(val2, method)
}

并按如下方式应用

v.l.df$new_col_1 <- a.f.2(v.l.df$V1, v.l.df$V2, 1)
v.l.df$new_col_2 <- a.f.2(v.l.df$V1, v.l.df$V2, 2)

您可以使用...参数编写此摘要函数,以获取任意数量的输入。下面的示例期望(并且不检查)数据框的列

a.f.n<- function(method,...){
    rowSums(sapply(...,a.f,method))
}

然后按如下方式应用:

v.l.df$new_col_1 <- a.f.n(v.l.df[,1:1000], method=1)
v.l.df$new_col_2 <- a.f.n(v.l.df[,1:1000], method=2)

我不确定这会有多高效,但它很紧凑。 : - )