【问题标题】:How to merge multiples columns of a table into 1 in R如何在R中将表的多个列合并为1
【发布时间】:2015-08-19 14:36:28
【问题描述】:

我有一个包含多列 (t1,t2,t3,t4,t5,t6) 的数据框 (control.sub)。我想将所有这些列合并为一个,也应该删除 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) 包含所有值。

【问题讨论】:

  • 如果您尝试连接字符串,请参阅?paste
  • paste 正在连接我给出的列,我不想连接,我希望它们在单独的行中。 : > control.sub$Mix control.sub$Mix [1] "5500024017802120306174.H01 5500024017802120306174 .G02" "5500024030401071707292.H01 5500024030401071707292.G02" [3] "5500024035736031208612.G08 5500024035736031208612.E09"
  • 你需要使用collapse=' ',我会告诉你

标签: r merge


【解决方案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

【讨论】:

  • 问题出在它连接所有列的值。例如对于 row1 生成 1 a 11,而我想要一行中的一个值,(row1 = 1,row2 = a,row3 = 11 等等......)
  • @user3253470 你的例子是错误的,因为行号保持不变:29、810、4693。
  • 你说得对,只有 3 行,但我想要尽可能多的值。
  • @user3253470 看到我的编辑——但你真的应该努力很好地提出这个问题,并提供一个最小可重复(和正确)的例子。
  • @user3253470 很乐意为您提供帮助,如果您想接受,请点击答案旁边的复选标记
【解决方案2】:

以下代码有效,但我不知道是否有人会认为它“最佳”:

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

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

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

sapply(control.sub,class)

那么你应该先运行:

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

编辑:这样更好:

 var <- unlist(control.sub)

【讨论】:

  • 可能它正在返回值的索引。我想要值而不是索引。 > 变量 [1] 133 123 123 123 123 91 161 151 151 151 151 113 249 225 225 225 225 NA
  • 确保您的列不是因素,并尝试我的新解决方案。
  • 还是同样的问题:> var var [1] 133 161 249 123 151 225 123 151 225 123 151 225 123 151 225 91 113 不适用
  • 我说过要先确保你的变量不是因素。
  • 对不起,我不知道如何检查这个东西......!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多