2

我需要一些关于 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 值。任何人都可以帮我解决这个问题吗?

提前致谢!

4

3 回答 3

2

Problem is df1 columns are factor, use as.is=TRUE when reading in the data.

Example:

#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
于 2014-06-23T13:58:01.857 回答
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.tableor的参数data.frame。如果你设置stringsAsFactorsFALSE你可以使用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
于 2014-06-23T13:53:13.710 回答
1

?rbindlistfrom library(data.table) 似乎也适用于因子列。

 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
于 2014-06-23T17:41:46.437 回答