如何将表的多个列合并为R中的1

时间:2015-08-19 14:36:29

标签: r merge

我有一个包含多列(control.sub)的数据框(t1,t2,t3,t4,t5,t6)。我想将所有这些列合并为一个,也应删除NA。

> control.sub
                             t1                         t2                         t3                         t4
29   5500024017802120306174.H01 5500024017802120306174.G02 5500024017802120306174.E03 5500024017802120306174.D04
810  5500024030401071707292.H01 5500024030401071707292.G02 5500024030401071707292.E03 5500024030401071707292.D04
4693 5500024035736031208612.G08 5500024035736031208612.E09 5500024035736031208612.D10 5500024035736031208612.B11
                             t5                         t6
29   5500024017802120306174.B05 5500024017802120306174.A06
810  5500024030401071707292.B05 5500024030401071707292.A06
4693 5500024035736031208612.A12                       <NA>

我希望最终结果如下:

> control.sub
                                 t1
    29   5500024017802120306174.H01 5500024017802120306174.G02 5500024017802120306174.E03 5500024017802120306174.D04
    810  5500024030401071707292.H01 5500024030401071707292.G02 5500024030401071707292.E03 5500024030401071707292.D04
    4693 5500024035736031208612.G08 5500024035736031208612.E09 5500024035736031208612.D10 5500024035736031208612.B11

       5500024017802120306174.B05 5500024017802120306174.A06
      5500024030401071707292.B05 5500024030401071707292.A06
     5500024035736031208612.A12

包含所有值的一列(t1)。

2 个答案:

答案 0 :(得分:1)

略多reproducible example

df <- data.frame(t1 = c(letters[1:5],NA), t2 = c(NA, LETTERS[6:10]), 
                 t3 = c(11:12,NA,13:15), stringsAsFactors=FALSE)
df
#     t1   t2 t3
# 1    a <NA> 11
# 2    b    F 12
# 3    c    G NA
# 4    d    H 13
# 5    e    I 14
# 6 <NA>    J 15


df2 <- data.frame(t1 = apply(df, 1, function(s) paste(s[!is.na(s)], collapse=" ")) )

df2
#       t1
# 1   a 11
# 2 b F 12
# 3    c G
# 4 d H 13
# 5 e I 14
# 6   J 15

修改

我认为OP正在寻找这个,但他/她的例子是错误的:

unlist_not_na <- function(df){
  v <- unlist(df)
  v[!is.na(v)]
}
df3 <- data.frame(t1 = unlist_not_na(df))

df3
#     t1
# t11  a
# t12  b
# t13  c
# t14  d
# t15  e
# t22  F
# t23  G
# t24  H
# t25  I
# t26  J
# t31 11
# t32 12
# t34 13
# t35 14
# t36 15

答案 1 :(得分:0)

以下代码有效,但我不知道是否有人会考虑它&#34;最佳&#34;:

var <- as.vector(do.call('c',control.sub))

我建议你在生成control.sub的代码中更高(如果可能),然后在那里操作输出格式。

如果您的变量是因素(您可以通过运行来检查:)

sapply(control.sub,class)

然后你应该先运行:

controlsub<-lapply(control.sub,as.character)

编辑:这是更好的:

 var <- unlist(control.sub)