【问题标题】:Maintaining a consistent set of rows after a subset [duplicate]在子集之后保持一组一致的行[重复]
【发布时间】:2020-11-05 21:23:36
【问题描述】:

我有一个场景,我需要呈现一个一致的数据表,并经常刷新。

我的源数据可能如下所示:

Item     | Quantity
-------------------
Dog      | 2
Cat      | 1
Apple    | 6
Banana   | 2
Kiwi     | 4

我只需要我的来源中的一些项目,这些项目可能会出现也可能不会出现。 目前我正在使用子集来选择感兴趣的项目:

groceries <- subset(data, item == "Apple"  | 
                           item == "Orange" | 
                           item == "Banana" |
                           item == "Kiwi"
)

结果:

Item     | Quantity
-------------------
Apple    | 6
Banana   | 2
Kiwi     | 4

但是,我需要为源中包含的那些项目包含空白行,以便我的表在刷新之间保持一致:

Item     | Quantity
-------------------
Apple    | 6
Orange   |
Banana   | 2
Kiwi     | 4

请问有人能指导我如何最好地处理上述问题吗?

【问题讨论】:

  • 创建一个包含感兴趣项目的数据框并与您的原始数据合并,而不是子集。类似merge(df, data.frame(Item = c(....)), by = 'Item')

标签: r subset


【解决方案1】:

我们可以使用 mergeall.x = TRUE:

# data
df1 <- read.table(text = "Item Quantity
Dog 2
Cat 1
Apple 6
Banana 2
Kiwi 4", header = TRUE)

# lookup table
x <- data.frame(Item = c("Apple", "Orange", "Banana", "Kiwi"))

# merge
merge(x, df1, by = "Item", all.x = TRUE)
#     Item Quantity
# 1  Apple        6
# 2 Banana        2
# 3   Kiwi        4
# 4 Orange       NA

【讨论】:

    【解决方案2】:

    不合并两个数据框的另一种选择。

    library(dplyr)
    item <- c("Apple", "Orange", "Banana", "Kiwi")
    
    df1 %>%
      filter(Item %in% item) %>%
      tidyr::complete(Item = item)
    
    # # A tibble: 4 x 2
    #   Item   Quantity
    #   <chr>     <int>
    # 1 Apple         6
    # 2 Banana        2
    # 3 Kiwi          4
    # 4 Orange       NA
    

    带有match()base 解决方案。

    data.frame(Item = item, Quantity = df1$Quantity[match(item, df1$Item)])
    
    #     Item Quantity
    # 1  Apple        6
    # 2 Orange       NA
    # 3 Banana        2
    # 4   Kiwi        4
    

    【讨论】:

      【解决方案3】:

      使用 dplyr 包中的 left_join() 可以实现同样的目的

      #raw data
      raw_data <- data.frame(raw_quantity = c(1,2,3), item = c("Apple", "Dog", "Lime"))
      
      #parent file
      parent_file <- data.frame(parent_quantity = c(0,2,3), item = c("Apple", "Banana", "Kiwi"))
      
      library(dplyr)
      x <- left_join(parent_file, raw_data, by = "item")
      

      请注意,left_join 保留了连接左侧的所有行,在本例中为 parent_file 并将创建一个额外的列 raw_quantity 用于文档,可以通过以下方式轻松删除

      x <- x[, c("item", "parent_quantity")]
      

      【讨论】:

        猜你喜欢
        • 2018-01-27
        • 2013-09-11
        • 2012-06-26
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多