数据框从数字更改为字符

时间:2015-03-13 19:39:35

标签: r csv character numeric

我打开我的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))

此处它变为&#34;字符&#34;

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的载体

我不知道现在要做什么,一旦我触摸它改变角色的框架,有人可以帮助我吗?感谢

1 个答案:

答案 0 :(得分:4)

之所以发生这种情况,是因为apply会将您的data.frame转换为matrix,而那些只能包含一个类。

请改为尝试:

sapply(mydataP, class)

这就是您通常应该尝试避免在apply上使用data.frame的原因。

此行为记录在帮助文件(?apply)中:

  

如果X不是数组,而是具有非null暗淡的类的对象   值(例如数据框)应用尝试将其强制转换为数组   如果它是二维的(例如,数据帧)或通过,则通过as.matrix   as.array。


这是一个内置虹膜数据集的可重复示例:

> 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将所有列转换为同一个类。