R - 根据应用于同一行中其他值的函数设置值

时间:2015-10-01 12:57:58

标签: r apply

我有一个包含(惊喜)数据的数据框。我有一列我希望按行进行填充,根据同一行中其他列的值计算。

从谷歌搜索,似乎我需要'申请',或其中一个近亲。不幸的是,我还没有设法让它真正起作用。

示例代码:

#Example function
getCode <- function (ar1, ar2, ar3){
  if(ar1==1 && ar2==1 && ar3==1){
    return(1)
  } else if(ar1==0 && ar2==0 && ar3==0){
    return(0)
  } 
  return(2)
}

#Create data frame
a = c(1,1,0)
b = c(1,0,0)
c = c(1,1,0)
df <- data.frame(a,b,c)
#Add column for new data
df[,"x"] <- 0

#Apply function to new column
df[,"x"] <- apply(df[,"x"], 1, getCode(df[,"a"], df[,"b"], df[,"c"]))

我想df取自:

  a b c x
1 1 1 1 0
2 1 0 1 0
3 0 0 0 0

  a b c x
1 1 1 1 1
2 1 0 1 2
3 0 0 0 0

不幸的是,运行这个吐出来了:

  

match.fun(FUN)出错:'getCode(df [,“a”],df [,“b”],df [,   “c”])'不是函数,字符或符号

我是R的新手,如果答案非常简单,请道歉。感谢。

2 个答案:

答案 0 :(得分:2)

一些事情:申请将沿着数据框本身(即apply(df, 1, someFunc));使用$运算符按名称访问列更具惯用性。因此,如果我有一个名为df的数据框,其中包含名为a的列,请使用df$a访问a。< / p>

在这种情况下,我喜欢在数据框的索引上执行sapply,然后使用该索引从数据框中获取适当的元素。

df$x <- sapply(1:nrow(df), function(i) getCode(df$a[i], df$b[i], df$c[i]))

答案 1 :(得分:2)

正如上面提到的@devmacrile,我只是修改函数,以便能够获得一个包含3个元素作为输入的向量,并在你提到的apply命令中使用它。

#Example function
getCode <- function (x){
  ifelse(x[1]==1 & x[2]==1 & x[3]==1,
         1,
         ifelse(x[1]==0 & x[2]==0 & x[3]==0,
                0,
                2))    }


#Create data frame
a = c(1,1,0)
b = c(1,0,0)
c = c(1,1,0)

df <- data.frame(a,b,c)
df

#   a b c
# 1 1 1 1
# 2 1 0 1
# 3 0 0 0


# create your new column of results
df$x = apply(df, 1, getCode)
df

#   a b c x
# 1 1 1 1 1
# 2 1 0 1 2
# 3 0 0 0 0