0

我真的不明白什么时候可以使用不同的功能。我总是有同样的问题......“它不适用于原子向量、数据帧、矩阵......等。

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

2 回答 2

5

认为您在这里可能有两个问题:

首先,要么你认为你有一个data.frame实际上你有一个矩阵,要么你的数据在某个时候是一个矩阵,现在是一个data.frame所以所有预期的数值都被转换为字符,然后factor在返回数据的路上被转换为。框架。

如果您的数据是矩阵,$则未定义访问matrices因此"$ operator is invalid for atomic vectors"错误。其次,如果您有一个矩阵,并且 a 中的所有数据matrix 必须是相同的 type,那么您的所有列都是 type 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" 
于 2013-10-21T09:42:16.717 回答
1

您可以尝试在减去之前使用函数将列转换为“数字”as.numeric

data$S1.pre <- as.numeric(data$S1.pre)
于 2013-10-21T09:20:15.717 回答