减去两列

时间:2013-10-21 08:58:07

标签: r

当我能够使用不同的功能时,我真的无法理解。我总是遇到同样的问题......“它不适用于原子矢量,数据帧,矩阵......等等。

有人可以解释我如何减去两列矩阵或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"

2 个答案:

答案 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)