R中的rbind()函数在合并的数据帧中产生NA

时间:2014-06-23 13:43:21

标签: r merge rbind

我需要一些关于R中rbind函数的帮助。我有以下2个数据帧。

DF1

        col1    col2    col3
row1        0       1       0
row2    txt1    txt2    txt3
row3    txtA    txtB    txtC
row4        51      93      83

DF2

        col1    col2    col3
row5    0.732   0.345   0.532
row6    0.453   0.123   0.456
row7    0.656   0.987   0.321
row8    0.432   0.030   0.754

我想合并这两个数据帧,所以我使用rbind函数来获得以下内容:

        col1    col2    col3
row1        0       1       0
row2    txt1    txt2    txt3
row3    txtA    txtB    txtC
row4        51      93      83
row5    0.732   0.345   0.532
row6    0.453   0.123   0.456
row7    0.656   0.987   0.321
row8    0.432   0.030   0.754

但是,这不是我得到的。我用的时候 合并< - rbind(df1,df2),我得到了

    col1    col2    col3
row1        0       1       0
row2    txt1    txt2    txt3
row3    txtA    txtB    txtC
row4        51      93      83
row5    <NA>    <NA>    <NA>
row6    <NA>    <NA>    <NA>
row7    <NA>    <NA>    <NA>
row8    <NA>    <NA>    <NA>

因此,当我合并这两个数据帧时,我获得了df2的NA值。能帮助我做到这一点吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

问题是一个数据帧只有数值而另一个没有。

这是一种解决方法:

> data.frame(t(data.frame(t(df1), t(df2))))
      col1  col2  col3
row1     0     1     0
row2  txt1  txt2  txt3
row3  txtA  txtB  txtC
row4    51    93    83
row5 0.732 0.345 0.532
row6 0.453 0.123 0.456
row7 0.656 0.987 0.321
row8 0.432 0.030 0.754

我不确定您是如何阅读数据的,但您可以查看stringsAsFactors参数,例如read.tabledata.frame。如果您将stringsAsFactors设置为FALSE即可 使用rbind

使您的示例可重现:

> df1 = read.table(header=T, stringsAsFactors=F, text='        col1    col2    col3
+ row1        0       1       0
+ row2    txt1    txt2    txt3
+ row3    txtA    txtB    txtC
+ row4        51      93      83')

> df2 = read.table(header=T, text='        col1    col2    col3
+ row5    0.732   0.345   0.532
+ row6    0.453   0.123   0.456
+ row7    0.656   0.987   0.321
+ row8    0.432   0.030   0.754')

> rbind(df1, df2)
      col1  col2  col3
row1     0     1     0
row2  txt1  txt2  txt3
row3  txtA  txtB  txtC
row4    51    93    83
row5 0.732 0.345 0.532
row6 0.453 0.123 0.456
row7 0.656 0.987 0.321
row8 0.432  0.03 0.754

答案 1 :(得分:2)

问题是df1列是因素,在读取数据时使用as.is=TRUE

示例:

#reproducible df1
df1 <- read.table(text="
col1    col2    col3
row1        0       1       0
row2    txt1    txt2    txt3
row3    txtA    txtB    txtC
row4        51      93      83",header=TRUE,as.is=TRUE)

#reproducible df2
df2 <- read.table(text="
col1    col2    col3
row5    0.732   0.345   0.532
row6    0.453   0.123   0.456
row7    0.656   0.987   0.321
row8    0.432   0.030   0.754",header=TRUE)

#result
rbind(df1,df2)

# col1  col2  col3
# row1     0     1     0
# row2  txt1  txt2  txt3
# row3  txtA  txtB  txtC
# row4    51    93    83
# row5 0.732 0.345 0.532
# row6 0.453 0.123 0.456
# row7 0.656 0.987 0.321
# row8 0.432  0.03 0.754

答案 2 :(得分:1)

来自库(data.table)的

?rbindlist似乎也适用于因子列。

 df1 <- read.table(text='col1    col2    col3
 row1        0       1       0
 row2    txt1    txt2    txt3
 row3    txtA    txtB    txtC
 row4        51      93      83',header=T,stringsAsFactors=T)

 df2 <-  read.table(text='col1    col2    col3
 row5    0.732   0.345   0.532
 row6    0.453   0.123   0.456
 row7    0.656   0.987   0.321
 row8    0.432   0.030   0.754',header=T)

 library(data.table)
  rbindlist(list(df1,df2)) #returns factor columns
 #  col1  col2  col3
 #1:     0     1     0
 #2:  txt1  txt2  txt3
 #3:  txtA  txtB  txtC
 #4:    51    93    83
 #5: 0.732 0.345 0.532
 #6: 0.453 0.123 0.456
 #7: 0.656 0.987 0.321
 #8: 0.432  0.03 0.754