【问题标题】:Align data frame with missing values to full data frame based on order根据顺序将具有缺失值的数据框与完整数据框对齐
【发布时间】:2021-08-13 13:52:07
【问题描述】:

我在 R 中有两个数据框。一个“参考”框包含我的所有观察结果,另一个额外的数据框包含(大)观察子集的额外数据。我想将两个框架连接在一起,用NA 填充缺失的值。复杂性(使我无法只使用merge/left_join)是观察只能使用几列的组合来唯一标识,但附加数据框仅包含一个标识列。但是,保证两个数据帧的顺序是一样的。

这里有一些最小的示例数据,也说明了问题:

library(tidyverse)

fruit_sizes = tribble(~fruit,       ~colour,  ~size,
                      "apple",      "red",    5,
                      "cherry",     "red",    2,
                      "strawberry", "red",    3,
                      "apple",      "green",  6,
                      "lime",       "green",  4,
                      "apple",      "yellow", 5)

fruit_prices = tribble(~fruit,       ~price,
                       "apple",      1.5,
                       "strawberry", 0.2,
                       "lime",       2.0,
                       "apple",      1.3)

# Desired result:
#
# # A tibble: 6 x 4
#   fruit      colour  size price
#   <chr>      <chr>  <dbl> <dbl>
# 1 apple      red        5   1.5
# 2 cherry     red        2  NA
# 3 strawberry red        3   0.2  
# 4 apple      green      6  NA  
# 5 lime       green      4   2  
# 6 apple      yellow     5   1.3

(水果由名称和颜色标识,但prices 表缺少颜色信息。但是,两个表的水果顺序相同。)

所以现在我的问题是如何使用第二个表的订单信息将其数据与第一个表对齐/匹配。可以假设不存在模棱两可的情况。 (我在示例和实际数据中使用了 tibbles,但非tidyverse 解决方案也可以。)

【问题讨论】:

    标签: r dataframe merge tidyverse


    【解决方案1】:

    for 循环解决方案 -

    fruit_sizes$price <- NA
    j <- 1
    for(i in seq(nrow(fruit_sizes))) {
        if(fruit_sizes$fruit[i] == fruit_prices$fruit[j]) {
          fruit_sizes$price[i]  <- fruit_prices$price[j]
          j <- j + 1
        }
    }
    fruit_sizes
    
    #  fruit      colour  size price
    #  <chr>      <chr>  <dbl> <dbl>
    #1 apple      red        5   1.5
    #2 cherry     red        2  NA  
    #3 strawberry red        3   0.2
    #4 apple      green      6  NA  
    #5 lime       green      4   2  
    #6 apple      yellow     5   1.3
    

    【讨论】:

    • 这看起来可以很好地处理示例数据。
    猜你喜欢
    • 2016-11-10
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2021-08-18
    • 2014-03-29
    相关资源
    最近更新 更多