3

早上好。

我正在循环浏览一些数据,边走边构建数据框。每次我在数据框中添加或替换一行时,数值都会被归类为字符,我必须重新对它们进行分类。我认为在将数据添加到数据框时我做错了什么?

test.df<-data.frame(SIDE=rep("",5),n=rep(NA, 5),c1=rep(NA,5),stringsAsFactors=FALSE)
test.df[1,]<-cbind("A",1,256)
test.df[2,]<-cbind("A",2,258)
test.df[3,]<-cbind("A",3,350)
test.df[4,]<-cbind("A",4,400)
test.df[5,]<-cbind("A",5,360)
summary(test.df)
 SIDE                n                  c1           
  Length:5           Length:5           Length:5          
  Class :character   Class :character   Class :character  
  Mode  :character   Mode  :character   Mode  :character  

将数值列转换为数值:

test.df[, c(2:3)] <- sapply(test.df[, c(2:3)], as.numeric)
summary(test.df)
 SIDE                 n           c1       
 Length:5           Min.   :1   Min.   :256.0  
 Class :character   1st Qu.:2   1st Qu.:258.0  
 Mode  :character   Median :3   Median :350.0  
                    Mean   :3   Mean   :324.8  
                    3rd Qu.:4   3rd Qu.:360.0  
                    Max.   :5   Max.   :400.0  

所以数据框现在正如我所期望的那样 - 1 列字符数据和 2 列数字。但是,如果我再次更改其中一行:

test.df[5,]<-cbind("A",5,360)
summary(test.df)
 SIDE                n                  c1           
 Length:5           Length:5           Length:5          
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  

它已经恢复了所有字符!

有什么方法可以确保当我在数据框中追加/更改数据时,它会保留适当的类?

谢谢,皮特

4

3 回答 3

6

cbind("A",5,360)是一个矩阵,它只能保存一种类型,即你的情况下的字符。

使用 data.frame 方法:

cbind.data.frame("A",5,360)

然而,“循环浏览一些数据”可能是 R 中效率最低的方法。

于 2013-08-05T07:04:18.517 回答
4

当你形成一个矩阵时,它都是相同的模式,所以这cbind("A",1,256)都是字符模式。(有一个 cbind.data.frame 函数,但 cbind 的参数都不是 data.frames,所以它没有被调用。你可以这样做:

test.df<-data.frame(SIDE="A",n=1,c1=256,stringsAsFactors=FALSE)
test.df<- rbind( test.df,
                  list("A",2,258),
                  list("A",3,350),
                  list("A",4,400),
                  list("A",5,360) )
 test.df
#---------------    
  SIDE n  c1
1    A 1 256
2    A 2 258
3    A 3 350
4    A 4 400
5    A 5 360
于 2013-08-05T07:05:08.300 回答
1

刚遇到类似的问题,最快的方法(我认为)是设置options(stringsAsFactors=FALSE)

于 2016-06-08T15:11:11.767 回答