我在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行。
答案 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
。