当我能够使用不同的功能时,我真的无法理解。我总是遇到同样的问题......“它不适用于原子矢量,数据帧,矩阵......等等。
有人可以解释我如何减去两列矩阵或data.frame或任何东西......
这是我的数据:
id cond S1.pre S2.pre S1.post S2.post V1.pre V2.pre V1.post V2.post
1 aer 21 31 25 35 7 1 19 4
2 aer 15 26 21 29 13 11 16 14
3 aer 18 27 23 31 8 2 3 3
4 aer 17 31 18 39 13 11 15 14
5 aer 15 26 16 29 26 15 32 20
我想减去列S1.post - S1.pre。
这就是我的尝试:
> diff <- data[,"S1.post"] - data[,"S1.pre"]
Error in data[, "S1.post"] - data[, "S1.pre"] :
non-numeric argument to binary operator
> diff <- data$S1.post - data$S1.pre
Error in data$S1.post : $ operator is invalid for atomic vectors
课程:
> class("S1.pre")
[1] "character"
> class("data")
[1] "character"
答案 0 :(得分:5)
我认为你可能有两个问题:
首先要么认为你有一个data.frame
,实际上你有一个矩阵,或者你的数据在某个时刻是矩阵,现在是data.frame
所以所有预期的数值转换为字符,然后在返回data.frame的路上转换为factor
。
如果您的数据是矩阵,则未定义$
来访问matrices
,因此"$ operator is invalid for atomic vectors"
错误。其次,如果您有一个矩阵,并且matrix
中的所有数据必须属于同一类型,那么您的所有列都属于character
类型。
如果您输入class( data )
,我希望它会返回"matrix"
。
我会转换为data.frame,然后将相应的列转换为integer
以供进一步使用...
data <- as.data.frame( data )
data2 <- do.call( data.frame , c(data[,1:2] , lapply( data[,-c(1:2)] , as.integer ) ) )
然后希望你会看到......
sapply( data2 , class )
# id cond S1.pre S2.pre S1.post S2.post V1.pre V2.pre V1.post V2.post
# "factor" "factor" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer"
答案 1 :(得分:1)
您可以尝试使用函数as.numeric
data$S1.pre <- as.numeric(data$S1.pre)