我有一个包含(惊喜)数据的数据框。我有一列我希望按行进行填充,根据同一行中其他列的值计算。
从谷歌搜索,似乎我需要'申请',或其中一个近亲。不幸的是,我还没有设法让它真正起作用。
示例代码:
#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的新手,如果答案非常简单,请道歉。感谢。
答案 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