我有一个非常大的数据帧...
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
答案 0 :(得分:0)
我会在几个步骤中完成此操作。您可以减少到更少的步骤,但我更喜欢让它更具可读性:
首先,将a.f
应用于所有单元格两次,将action=1
和action=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)
同时rowSums
和action.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)
假设您的前两列分别命名为V1
和V2
。
您也可以定义另一个功能
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)
我不确定这会有多高效,但它很紧凑。 : - )