2013-10-21 32 views
1

當我能夠使用不同的功能時,我真的無法理解。我一直有同樣的問題......「這不是vaild原子能載體,dataframes,矩陣...等兩列的減法

有人可以解釋我怎麼能矩陣。減去或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" 
+1

我可以」不要複製你的問題。 'data [,「S1.post」] - data [,「S1.pre」] [1] 4 6 5 1 1'。此外,使用類'(數據)'和不'類( 「數據」)'.' 「數據」''是但character''data'是(或應是)一個'data.frame' –

+0

我所用的「數據< - read.delim(「Stats1.13.HW.03.txt」)「讀取一個txt文件。 –

+1

嘗試將適當的列轉換爲整數,然後重試。如果你想...'data2 < - do.call(data.frame,c(data [,1:2],lapply(data [, - c(1:2)],as.integer) ))'。你會得到一個新的data.frame'data2',你可以使用'data2 [,'S1.post'] - data2 [,'S1.pre']'。 –

回答

5

認爲你有可能有兩個問題在這裏:

第一任你認爲你有data.frame時候,其實你有一個墊RIX,或者你的數據是在一些點矩陣,現在是一個data.frame所以所有預期數值得到轉換爲字符,然後得到了轉化爲factor上回data.frame的方式。

如果您的數據是矩陣,則$未定義爲訪問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) 
+0

Thx。這是okey。 –