2017-02-15 62 views
2

我一直對R中變量類型感到困惑。現在我在轉置數據幀後遇到了一個問題。轉置數據幀後R變量類型發生變化

例如,我使用table()得到各因子的數量在一定的載體:

data(iris) 

count <- as.data.frame(table(iris$Species)) 
typeof(count$Var1) 
# [1] "integer" 

typeof(count$Freq) 
# [1] "integer" 

我的第一個問題是,爲什麼count$Var1「整數」?字符串是否也可以是「整數」?但這並不重要,因爲我可以通過count$Var1 <- as.character(count$Var1)更改類型,然後typeof(count$Var1)變成「字符」。

現在我轉置此數據幀transposed_count <- as.data.frame(t(count))。但我感到困惑,因爲:

typeof(transposed_count[1,]) 
[1] "list" 

typeof(transposed_count[2,]) 
[1] "list" 

transposed_count[2,] 
    V1 V2 V3 
Freq 50 50 50 

對於後續的使用,我需要transposed_count[2,]是一個數值向量,如:

transposed_count[2,] 
[1] 50 50 50 

我怎麼能這樣做?爲什麼他們成爲t()之後的「名單」?對不起,如果這是一個愚蠢的問題。謝謝!

回答

3

我的第一個問題是,爲什麼是count$Var1「整數」?

由於因素是具有整數存儲類型

> is.factor(count$Var1) 
[1] TRUE 

和虹膜data.frame的「串」,如R中典型被存儲作爲因子。

爲什麼他們成爲t()後的「名單」?

當你轉置你得到一個矩陣,並且矩陣必須爲每個條目具有相同的存儲類別。你實際首先得到的是一個字符矩陣,因爲整數值將被強制。然後,當您隨後更改爲data.frame時,這些字符將默認強制爲(新)因素。

> t(count) 
    [,1]  [,2]   [,3]  
Var1 "setosa" "versicolor" "virginica" 
Freq "50"  "50"   "50" 

> transposed_count <- as.data.frame(t(count)) 

> transposed_count[2,1] 
Freq 
    50 
Levels: 50 setosa 
> as.numeric(transposed_count[2,1]) 
[1] 1 

那麼現在計數爲50的數值是1的一個因子!不是你想要的。

至於爲什麼typeof(transposed_count[1,])是一個列表?作爲data.frame的水平切片,它實際上是一個data.frame。

> is.data.frame(transposed_count[2,]) 
[1] TRUE 

而data.frames只是帶有類信息的列表。

但是我怎樣才能得到一個「轉置」的數據幀呢?

這聽起來像你可能想

> library(reshape2) 
> dcast(melt(count), variable~Var1) 
Using Var1 as id variables 
    variable setosa versicolor virginica 
1  Freq  50   50  50 

後,我讀了所有的樣品,我會rbind所有的數據幀

你必須確保列適當排隊。根據分析的結果,rbind可能更爲自然,就像另一列顯示來源一樣。

> count2 <- count 
> count$source = "file1" 
> count2$source = "file2" 
> (mcount <- rbind(count,count2)) 
     Var1 Freq source 
1  setosa 50 file1 
2 versicolor 50 file1 
3 virginica 50 file1 
4  setosa 50 file2 
5 versicolor 50 file2 
6 virginica 50 file2 

現在你不用擔心對齊如果你想重塑後

> dcast(melt(mcount), ...~Var1) 
Using Var1, source as id variables 
    source variable setosa versicolor virginica 
1 file1  Freq  50   50  50 
2 file2  Freq  50   50  50 
+0

感謝您的解釋!對我來說變得更加清晰。但是,我怎樣才能得到一個「轉置」的數據框呢? – Yan

+0

我正在讀一堆文件,每個文件作爲每個樣本。最後,我需要一個數據框,其中行是樣本,列是每個文件/樣本中每個元素的數量。所以在我讀完所有的樣本之後,我會去掉所有的數據框。這就是爲什麼我需要它轉置。我將把「Var1」作爲最終數據框的名稱。 – Yan

+0

正如@RomanLuštrik推斷的那樣,您可能正在從'reshape2'庫中尋找類似'dcast(melt(count),...〜Var1)'的東西。但是,根據您的分析結果,更自然的形狀可能是以原始格式「綁定」數據,並添加具有文件/樣本指標的另一列。這會給你一個「堆疊」的格式。 –

3

typeof會告訴你R如何在內部存儲數據。對於因素,這是整數。而Var1是一個因素,看?

> class(count$Var1) 
[1] "factor" 

transposed_counts在這種情況下是沒有意義的。通過轉置您銷燬data.frame邏輯。移位通常對矩陣有意義。如果你想「迴流」一個數據框,你可以使用類似reshape或其親戚的東西。

+0

感謝您的回答! – Yan

0

如果使物種名稱在VAR1爲行名前調換你避免轉置問題將所有內容轉換爲相同的數據類型。

data(iris) 
count <- as.data.frame(table(iris$Species)) 
row.names(count) <- count$Var1 
count$Var1 <- NULL 
transposed_count <- as.data.frame(t(count)) 
as.numeric(transposed_count[1,]) 
# [1] 50 50 50