【问题标题】:Adding rows in R based on columns values根据列值在 R 中添加行
【发布时间】:2021-10-25 13:23:53
【问题描述】:

我正在努力完成以下任务。这是我正在使用的数据集的一个虚拟示例(dput 输出):

structure(list(SHOPID = c("11T", "2T1", "33A", "14B", "29O"), PPCODE = c(4412, 
                      3567, 4412, 3567, 5123), PRICE = c(1.45, 1.21, 1.45, 1.21, 1.01
                       ), TYPE = c("LAR", "SMA", "SMA", "SMA", "LAR"
                       )), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
                       ))

任务是编写这样一个脚本,如果某些 ppcode 属于 SMA(小)类型,但不是 LAR(大)类型,则应在与该 ppcode 相关的数据相同的地方添加额外的行,但使用键入“LAR”。因此,在这个提供的示例中,应该在底部添加 SHOPID=NA, PPCODE=3567, PRICE= 1.21, TYPE=LAR 的行。这不仅适用于这种特殊情况,而且通常适用于更大的数据集。我更喜欢 dplyr 库并尝试使用它,但也欢迎使用其他解决方案。

【问题讨论】:

  • 了解completefill
  • SHOPID == 14B(不是 NA!) 其中PPCODE==3567 & PRICE== 1.21
  • @ChrisRuehlemann 这里是价格和 ppcode 的两倍。只有 shopid 是唯一键,不应将其复制到新行,因为相同的 ppcode 可以是不同的 shopid。这就是为什么新添加的类型为“LAR”的行的 shopid 应该为空的原因。

标签: r dataframe dplyr


【解决方案1】:

由于您只指定SMALAR 重复,因此很难使用tidyr::complete。这是另一种选择:

library(dplyr)
dat %>%
  group_by(PPCODE, PRICE) %>%
  filter(!"LAR" %in% TYPE) %>%
  ungroup() %>%
  mutate(SHOPID = NA, TYPE = "LAR") %>%
  distinct() %>%
  bind_rows(dat, .)
# # A tibble: 6 x 4
#   SHOPID PPCODE PRICE TYPE 
#   <chr>   <dbl> <dbl> <chr>
# 1 11T      4412  1.45 LAR  
# 2 2T1      3567  1.21 SMA  
# 3 33A      4412  1.45 SMA  
# 4 14B      3567  1.21 SMA  
# 5 29O      5123  1.01 LAR  
# 6 <NA>     3567  1.21 LAR  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2015-06-05
    相关资源
    最近更新 更多