【问题标题】:R append 2 data frames with different columnsR附加2个具有不同列的数据帧
【发布时间】:2020-04-13 21:58:53
【问题描述】:

我想将 dfToAdd 附加到 df,其中第一个缺少列。重要的细节是 df 有两种类型的列。第一组列相互关联。 例如group="A" 表示 name="Group A" 和 color="Blue"。不能有 A-Group A-Red 的组合。 第二种类型的列相互关联。 动物=“狗”动作=“树皮” 我想添加第二个数据框,其中缺少第一类列的列。这些列应填充第一类列的组合,如以下 dfResult(行的顺序无关紧要):

df = data.frame(group = c("A", "A", "A", "B", "B", "B"),
                name = c("Group A", "Group A", "Group A", "Group B", "Group B", "Group B"),
                color = c("Blue", "Blue", "Blue", "Red", "Red", "Red"),
                animal = c("Dog", "Cat", "Mouse", "Dog", "Cat", "Mouse"),
                action = c("Bark", "Meow", "Squeak", "Bark", "Meow", "Squeak")
                )

dfToAdd = data.frame(animal = c("Lion", "Bird"), 
                     action = c("Roar", "Chirp"))

dfResult = data.frame(group = c("A", "A", "A", "B", "B", "B", "A", "A", "B", "B"),
                      name = c("Group A", "Group A", "Group A", "Group B", "Group B", "Group B", "Group A", "Group A", "Group B", "Group B"),
                      color = c("Blue", "Blue", "Blue", "Red", "Red", "Red", "Blue", "Blue", "Red", "Red"),
                      animal = c("Dog", "Cat", "Mouse", "Dog", "Cat", "Mouse", "Lion", "Bird", "Lion", "Bird"),
                      action = c("Bark", "Meow", "Squeak", "Bark", "Meow", "Squeak", "Roar", "Chirp", "Roar", "Chirp"))
> df
  group    name color animal action
1     A Group A  Blue    Dog   Bark
2     A Group A  Blue    Cat   Meow
3     A Group A  Blue  Mouse Squeak
4     B Group B   Red    Dog   Bark
5     B Group B   Red    Cat   Meow
6     B Group B   Red  Mouse Squeak
> dfToAdd
  animal action
1   Lion   Roar
2   Bird  Chirp
> dfResult
   group    name color animal action
1      A Group A  Blue    Dog   Bark
2      A Group A  Blue    Cat   Meow
3      A Group A  Blue  Mouse Squeak
4      B Group B   Red    Dog   Bark
5      B Group B   Red    Cat   Meow
6      B Group B   Red  Mouse Squeak
7      A Group A  Blue   Lion   Roar
8      A Group A  Blue   Bird  Chirp
9      B Group B   Red   Lion   Roar
10     B Group B   Red   Bird  Chirp

但第一种类型的列(组、名称、颜色)尚不完全清楚。我正在处理任意数量的多个分组变量。你可以想象可能有也可能没有描述栏=“A组是好组”或日期=“2020.04.13”。我们只知道第二种类型的列:动物和动作。

【问题讨论】:

    标签: r dataframe tidyr rbind


    【解决方案1】:

    我们可以在单个%>% 中执行此操作,方法是sliceing 'df' 中的第一行,select 'dfToAdd' 中的列之外的列,将其与'dfToAdd' 绑定,然后使用“df”进行行绑定并使用complete

    library(dplyr)
    library(tidyr)
    library(rlang)
    library(purrr)
    df %>%
           slice(1) %>%
           select(-names(dfToAdd)) %>%  
           uncount(nrow(dfToAdd))  %>%     
           bind_cols(dfToAdd) %>%
           bind_rows(df, .) %>% 
           complete(nesting(!!! syms(names(dfToAdd))), 
                 nesting(!!! syms(setdiff(names(.), names(dfToAdd)))))
    # A tibble: 10 x 5
    #   animal action group name    color
    # * <fct>  <fct>  <fct> <fct>   <fct>
    # 1 Cat    Meow   A     Group A Blue 
    # 2 Cat    Meow   B     Group B Red  
    # 3 Dog    Bark   A     Group A Blue 
    # 4 Dog    Bark   B     Group B Red  
    # 5 Mouse  Squeak A     Group A Blue 
    # 6 Mouse  Squeak B     Group B Red  
    # 7 Bird   Chirp  A     Group A Blue 
    # 8 Bird   Chirp  B     Group B Red  
    # 9 Lion   Roar   A     Group A Blue 
    #10 Lion   Roar   B     Group B Red  
    

    【讨论】:

    • 我已经更新了我对使用未知列名问题的回答。它需要是动态的。我真的不知道“组,名称,颜色”。但我可以将它们放在字符向量中。
    • @Genom。您要更改哪个嵌套
    • 我了解动物和行动。所以嵌套(动物,动作)很好。但是,嵌套(组,名称,颜色)可以更多。像嵌套(组、名称、颜色、描述、日期、位置...)。实际上,这将是 dfToAdd 中所有缺失的列与 df 合并。
    • 我收到错误:参数 2 的长度必须为 1,而不是 bind_cols 中的 2。
    • 我接受了,因为这是最简单的答案。我正在用 sym 作为替代品来更新我的答案。非常感谢!
    【解决方案2】:

    在写这篇文章时,我的想法是在 tidyr 的 [complete][2] 函数的两侧使用 [nesting][1] 并手动检测丢失的列(也许有更优雅的解决方案):

    # First find all grouping columns
    groupCols = colnames(df)[!(colnames(df) %in% colnames(dfToAdd))]
    otherCols = colnames(df)[colnames(df) %in% colnames(dfToAdd)]
    # Populate missing columns with first grouping appearing in the df
    dfToAdd[groupCols] = df[1, groupCols]
    # rbind it to append
    dfResult = rbind(df, dfToAdd)
    # Now we have obvious missing combinations, tidyr::complete accepts nesting information to generate combinations only for those, which needs to be different.
    dfResult %>% tidyr::complete(tidyr::nesting(!!! syms(otherCols)), tidyr::nesting(!!! syms(groupCols)))
    

    编辑:实际上意识到我最后使用了未知的列名。这真的行不通。我需要将 groupCols(字符向量)提供给第二个嵌套调用。

    edit2:现在感谢 akrun 的回答,我也可以更正这个。

    【讨论】:

      猜你喜欢
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多