2015-03-13 46 views
2

我打開CSV文件,我控制着班我的每個數據的:數據幀更改字符

mydataP<-read.csv("Energy_protein2.csv", stringsAsFactors=F) 

apply(mydataP, 2, function(i) class(i)) 
#[1] "numeric" 

我添加一列,並檢查的數據類:

mydataP[ ,"ID"] <-rep(c("KOH1", "KOH2", "KOH3", "KON1", "KON2", "KON3", "WTH1", "WTH2", "WTH3","WTN1", "WTN2", "WTN3"), each=2) 

apply(mydataP, 2, function(i) class(i)) 

這裏變成一個 「性格」

as.numeric(as.factor(mydataP)) 
#Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
#Have you called 'sort' on a list? 

as.numeric(as.character(mydataP)) 

我得到117 NA矢量

我不知道現在該做什麼,只要我觸摸它改變角色的框架,有人能幫助我嗎?謝謝

回答

4

發生這種情況是因爲apply將您的data.frame轉換爲matrix,那些只能有一個類。

試試這個:

sapply(mydataP, class) 

這是你通常應該儘量避免data.frame S使用apply的原因。

此行爲是在幫助文件記錄(?apply):

如果X不是數組,但一個類的一個對象,具有一個非空暗淡 值(如數據幀),如果它是二維的(例如數據幀)或通過as.array應用嘗試通過as.matrix將它強制轉換爲數組 。


這裏有一個重複的例子,內置虹膜數據集:

> apply(iris, 2, function(i) class(i)) 
#Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "character" "character" "character" "character" "character" 

> sapply(iris, class) 
#Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

> str(iris) 
#'data.frame': 150 obs. of 5 variables: 
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
# $ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 

正如你所看到的,apply所有列轉換爲同一類。