如何在R数据帧列中检查系列中的跳过值?

时间:2017-11-08 02:41:56

标签: r dataframe

我在R中有一个包含四列的数据框price1

Name        Week         Price           Rebate
Car 1         1          20000            500
Car 1         2          20000            400
Car 1         5          20000            400
----          --          ----             ---
Car 1         54         20400            450

price1中共有10个车名,所以上面只是为了说明结构。每个汽车名称应有54个观察对应54周。但是,有几周没有观察到(例如,在上述情况下的第3周和第4周)。对于这些缺失的几周,我需要从另一个数据框price2

中插入信息
Name        AveragePrice   AverageRebate
Car 1         20000            500
Car 2         20000            400
Car 3         20000            400
----          ----             ---
Car 10        20400            450

因此,我需要在price1中为每个车名识别缺失的一周,在price2中捕获与该车名对应的行,然后在price1中插入该行。我无法绕过可能的方法,所以遗憾的是我没有一个代码片段可供分享。我在SO中的大多数搜索都引导我得到关于处理缺失值的答案,这不是我想要的。有人可以帮助我吗?

我还在下面指出了所需的输出:

Name        Week         Price           Rebate
Car 1         1          20000            500
Car 1         2          20000            400
Car 1         3          20200            410
Car 1         4          20300            420
Car 1         5          20000            400
----          --          ----            ---
Car 1         54         20400            450
----          --          ----            ---
Car 10        54         21400            600    

请注意,输出现在有第4周和第5周的Car 1信息,我应该从price2获取。对于10个汽车名称中的每一个,最终输出应包含54个观测值,因此总计540行。

3 个答案:

答案 0 :(得分:1)

试试这个,祝你好运

library(data.table)
carNames <- paste('Car', 1:10)
df <- data.table(Name = rep(carNames, each = 54), Week = rep(1:54, times = 10))
df <- merge(df, price1, by = c('Name', 'Week'), all.x = TRUE)
df <- merge(df, price2, by = 'Name', all.x = TRUE); df[, `:=`(Price = ifelse(is.na(Price), AveragePrice, Price), Rebate = ifelse(is.na(Rebate), AverageRebate, Rebate))] 
df[, 1:4]

答案 1 :(得分:0)

因此,如果我正确理解您的问题,您基本上有2个数据帧,并且您希望确保数据帧 - &#34; price1&#34;在姓名中有正确的rownames(汽车名称)&#39;列?

这是我要做的,但它可能不是最佳方式:

#create a loop with length = number of rows in your frame
for(i in 1:nrow(price1)){
  #check if the value is = NA,
  if (is.na(price1[1,i] == TRUE){
    #if it is NA, replace it with the corresponding value in price2
    price1[1,i] <- price2[1,i]
    }
  }

希望这会有所帮助(:

答案 2 :(得分:0)

如果我正确理解了您的问题,您只想查看第二个表中的内容而不是第一个表中的内容。您只想使用anti_join。请注意,您将表格输入anti_join的顺序很重要。

library(tidyverse)
complete_table ->
    price2 %>%
    anti_join(price1)

要扩展您的第一个表格以涵盖所有54周使用complete(),或者您甚至可以捏造它并right_join一张您将故意在其中构建的所有54周的表格。然后,任何没有加入第二个表的内容都会在该列中获得NA