Data frame changes from numeric to character

为君一笑 提交于 2019-12-19 10:27:38

问题


I open my csv file and I control the class of each of my data:

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

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

I add a column and check the class of the data:

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))

Here it changes to a "character"

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))

I get a vector with 117 NA

I have no idea what to do now, as soon I touch the frame it changes to character, can somebody help me? Thanks


回答1:


That happens because apply converts your data.frame to matrix and those can only have one class in them.

Try this instead:

sapply(mydataP, class)

This is the reason you should normally try to avoid using apply on data.frames.

This behavior is documented in the help file (?apply):

If X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array.


Here's a reproducible example with the built-in iris dataset:

> 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 ...

As you can see, apply converts all columns to the same class.



来源:https://stackoverflow.com/questions/29040647/data-frame-changes-from-numeric-to-character

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!