【问题标题】:How to merge 2 string columns in one dataframe?如何在一个数据框中合并 2 个字符串列?
【发布时间】:2020-06-25 15:24:11
【问题描述】:

我有一个包含 2 列基因名称的数据集,如下所示:

Gene_names1    Gene_names2
ACE                 .
BRCA                .
.                   SEP7
.                   CTFL
HER2                .
ZAP70               .

有没有办法让我将这些列合并到同一个数据集中以获得输出:

Gene_names1    Gene_names2     Gene_names3
ACE                 .              ACE
BRCA                .              BRCA
.                   CTFL           CTFL
.                   CTFL           CTFL 
HER2                .              HER2              
ZAP70               .              ZAP70

我一直在尝试使用类似的问题来回答这个问题,但大多数问题都是关于数字数据的,我在需要数值时遇到错误 - 有没有办法用字符串来做到这一点?

例如我试过:

df$Gene_names3 <- coalesce(df$Gene_names1, df$Gene_names2) #runs but is a replicate of Gene_names1

df$Gene_names3<-rowSums(df[, c("Gene_names1", "Gene_names2")], na.rm=T) #numeric error

df %>% mutate(Category = coalesce(Gene_names1, Gene_names2))

错误:列名XYZZ1 不得重复。 使用 .name_repair 指定修复。

我可以看到像 df[, Gene_names3 := Gene_names1][is.na(Gene_names1), Gene_names3 := Gene_names2][] 这样的东西可能会起作用,但我不知道如何将 is.na() 更改为“is”。如果这有意义的话。

我总共有 230 列,Gene_names1 实际上是第 210 列,而 Gene_names2 是第 222 列的上下文。

structure(list(Gene_names1 = c("ACE", "BRCA", ".", ".", "HER2", 
"ZAP70"), Gene_names2 = c(".", ".", "SEP7", "CTFL", ".", "."
)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
))

【问题讨论】:

  • 请给出可重现的例子
  • 谢谢,现在补充
  • df$Gene_names3 &lt;- gsub("[.]", "", paste0(df$Gene_names1, df$Gene_names2))?
  • coalesce 替换缺失的(即NA)值。您可以用NA 替换那些缺少信息的. 表示

标签: r dataframe merge data.table


【解决方案1】:

你可以简单地unlist,过滤掉.并附加到你的df,即

 df$new <- unlist(df)[unlist(df) != '.']

#   Gene_names1 Gene_names2   new
#1:         ACE           .   ACE
#2:        BRCA           .  BRCA
#3:           .        SEP7  HER2
#4:           .        CTFL ZAP70
#5:        HER2           .  SEP7
#6:       ZAP70           .  CTFL

【讨论】:

  • 谢谢您,我还有其他带有“。”的列这会混淆吗?我只用df$new &lt;- unlist(df$Gene_names1)[unlist(df$Gene_names2) != '.'] 尝试过,但新列仍然有.
  • 你的输出有点奇怪。订单应为ACE &gt; BRCA &gt; SEP7 &gt; CTFL &gt; HER2 &gt; ZAP70
【解决方案2】:

使用fcoalesce

df[] <- lapply(df, function(x) replace(x, x==".", NA))
df$Gene_names3 <- data.table::fcoalesce(df)
df

   Gene_names1 Gene_names2 Gene_names3
1:         ACE        <NA>         ACE
2:        BRCA        <NA>        BRCA
3:        <NA>        SEP7        SEP7
4:        <NA>        CTFL        CTFL
5:        HER2        <NA>        HER2
6:       ZAP70        <NA>       ZAP70

【讨论】:

    【解决方案3】:

    只需使用apply 在每一行中选择非"."

    dat$Gene_names3 <- apply(dat, 1, function(x) x[!x == "."])
    dat
    #    Gene_names1 Gene_names2 Gene_names3
    # 1:         ACE           .         ACE
    # 2:        BRCA           .        BRCA
    # 3:           .        SEP7        SEP7
    # 4:           .        CTFL        CTFL
    # 5:        HER2           .        HER2
    # 6:       ZAP70           .       ZAP70
    

    【讨论】:

    • 谢谢您,我还有其他带有“。”的列这会混淆吗?
    • @DN1 不是"." 的那些,否则只有一个单元格,每行都有一个值。注意有". "等空格。
    【解决方案4】:

    tidyr 中使用unite 将多列粘贴在一起。

    library(dplyr)
    library(tidyr)
    
    df %>%
      mutate_all(na_if, ".") %>% 
      unite("Gene_names3", sep = "", remove = F, na.rm = T)
    
      Gene_names3 Gene_names1 Gene_names2
    1         ACE         ACE        <NA>
    2        BRCA        BRCA        <NA>
    3        SEP7        <NA>        SEP7
    4        CTFL        <NA>        CTFL
    5        HER2        HER2        <NA>
    6       ZAP70       ZAP70        <NA>
    

    或者

    df %>%
      unite("Gene_names3", sep = "", remove = F) %>%
      mutate(Gene_names3 = sub("[.]", "", Gene_names3))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2020-05-22
      • 2018-12-18
      • 2018-12-07
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多