【问题标题】:Pasting values from one dataframe to another after satisfying multiple if conditions in R在满足R中的多个if条件后将值从一个数据帧粘贴到另一个数据帧
【发布时间】:2023-03-19 07:06:01
【问题描述】:

我正在尝试将一个数据框中的唯一值粘贴到单独数据框中新创建的列中。该功能需要满足多个条件。在这种情况下,两个数据框中的“日期”和“产品”值必须相同。

我已经尝试过 for、if 和 while 函数,但我似乎无法解决问题。

sales1 <- data.frame("Day" = c(01,02,03,04), "Product" = c("B","A","D","C"), "salesVol" = c(12,31,3,90))
sales2 <- data.frame("Day" = c(01,01,01,01,02,02,02,02,03,03,03,03,04,04,04,04), "Product" = c("A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D"), "Price" = c(9,3,4,5,7,10,5,8,4,5,11,3,12,4,7,6))
for (i in 1:nrow(sales1)){
  if (sales1$Product == sales2$Product
      && sales1$Day == sales2$Day)
  {
    sales1$dailyPrice[i] <- sales2$Price[i]
  }
}

请注意,sales2 中只能有一个唯一的日期/产品组合。

也试过了:

while (sales1$Product == sales2$Product
       && sales1$Day == sales2$Day){
    sales1$dailyPrice <- sales2$Price
}

生成的 sales1 数据框应该是:

Day Product salesVol dailyPrice
1    B        12       3
2    A        31       7
3    D        3        3
4    C        90       7

即当第 2 天且产品为“A”时,根据 sales2,“dailyPrice”为 7。

但充其量我得到的值不正确,最坏的情况是(上面的代码)没有任何东西被粘贴。也没有错误信息。谢谢。

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    这是你想要的吗?

    merge(sales1,sales2,by=c("Day","Product"))
    

    一切都在这里:

      sales1 <- data.frame("Day" = c(01,02,03,04),
     "Product" = c("B","A","D","C"), "salesVol" = c(12,31,3,90))
      sales2 <- data.frame("Day" = c(01,01,01,01,02,02,02,02,03,03,03,03,04,04,04,04),
      "Product" = c("A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D")
        , "Price" = c(9,3,4,5,7,10,5,8,4,5,11,3,12,4,7,6))
    sales1
    sales2
    merge(sales1,sales2,by=c("Day","Product"))
    

    【讨论】:

    • FWIW,如果上面是正确答案,这个问题可能是合并link的重复问题
    • 这可行,但我最初的问题有许多其他变量不必要地合并,如果有多个“产品”列,那么必须为每个产品重新合并它们,这将创建大量多余的数据。我真的只需要定位满足这些条件的值并将其粘贴到原始数据框中的新列中。
    • 如果 sales2 有一堆额外的列,只需将其子集即可。 merge(sales1, sales2[, c('Day', 'Product', 'Price')], by = c('Day', 'Product')) 并收工。
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-10-10
    • 2022-01-24
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多