【问题标题】:Combine multiple columns from a single dataframe in R into a new dataframe as one column in long form将 R 中单个数据框的多列组合成一个新的数据框,作为长格式的一列
【发布时间】:2020-07-25 00:06:24
【问题描述】:

我的数据框看起来像

ID  FMR  FML  KPR  KPL
----------------------
a    1   NA   NA   1
b    0   NA    1   0
c    NA   1   NA   NA
d    1   NA    0   NA
e    NA   1   NA   NA

我需要创建一个看起来像这样的新数据框

ID   FM   KP
-------------
a    1    NA
b    0     1
c    NA   NA
d    1     0
e    NA   NA
a    NA    1
b    NA    0
c    1    NA
d    NA   NA
e    1    NA

最好的方法是什么?

【问题讨论】:

  • 只是将 4 列合并为 2 列吗?还是您在寻找更通用的解决方案(将 N 列合并为 N/2)?
  • 首选更通用的解决方案。除了 ID 列之外,我还有 16 列需要组合成 8 个长列。

标签: r dataframe merge


【解决方案1】:

tidyverse(特别是coalesce())是你的朋友...


fm <- df %>%
  transmute(ID,
            FM = coalesce(FMR, FML))

kp <- df %>%
  transmute(ID,
            KP = coalesce(KPR, KPL))
fm %>%
  bind_rows(kp)

# A tibble: 10 x 3
   ID       FM    KP
   <chr> <dbl> <dbl>
 1 a         1    NA
 2 b         0    NA
 3 c         1    NA
 4 d         1    NA
 5 e         1    NA
 6 a        NA     1
 7 b        NA     1
 8 c        NA    NA
 9 d        NA     0
10 e        NA    NA

但是你确定你想要那个输出吗?例如,您将丢失有关 KP 是来自 KPR 还是来自 KPL 的信息。

【讨论】:

    【解决方案2】:

    从共享的示例中可以看出,列名的前两个字符标识了特定值所在的列。我们可以在tidyrpivot_longer 中使用它。

    tidyr::pivot_longer(df, cols = -ID, 
                        names_to = '.value', 
                        names_pattern = '(..)')
    
    
    #   ID       FM    KP
    #   <chr> <int> <int>
    # 1 a         1    NA
    # 2 a        NA     1
    # 3 b         0     1
    # 4 b        NA     0
    # 5 c        NA    NA
    # 6 c         1    NA
    # 7 d         1     0
    # 8 d        NA    NA
    # 9 e        NA    NA
    #10 e         1    NA
    

    这适用于任何数量的列,只要列名模式保持不变。

    数据

    df <- structure(list(ID = c("a", "b", "c", "d", "e"), FMR = c(1L, 0L, 
    NA, 1L, NA), FML = c(NA, NA, 1L, NA, 1L), KPR = c(NA, 1L, NA, 
    0L, NA), KPL = c(1L, 0L, NA, NA, NA)), class = "data.frame", 
    row.names = c(NA, -5L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2021-10-18
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多