我写了以下函数:
x <- 1:4
y <- c(1,2,7,4)
mydf <- data.frame(a=x,b=x,c=x,d=x,y=y)
practice <- function(x) if( x[1] == x[5]) {
foo <- (x[2])
return(foo)
} else {
bar <- x[3] + x[4]
foobar <- x[2] - bar
return(foobar)
}
newmydf <- apply( mydf, 1, practice)
这在data.frame
提供的工作正常。但是我有另一个data.frame
而且我一直在
Error in x[3] + x[4] : non-numeric argument to binary operator
尽管有以下str()
'data.frame': 133 obs. of 19 variables:
$ : chr ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : int ...
$ : num ...
$ : int
$ : int
我可以制作哪些小滑倒?我已经开始了一个新的会议,我仍然遇到同样的问题。
答案 0 :(得分:6)
第二个数据框的第一列中的值是“字符”类型。结果,命令apply
将整个数据帧转换为字符矩阵。未为字符值定义运算符+
。
有两种可能的解决方案:
将第一列转换为数字类型(如果可能):
mydf[ , 1] <- as.numeric(mydf[ , 1])
请勿使用数据框的第一列:
apply(mydf[ , -1], 1, practice)
答案 1 :(得分:4)
另一种解决方案是使用by
:
# Put in a character to mydf to test
mydf$foo<-'a'
# Run by
by(mydf,seq(nrow(mydf)),practice)