模拟条件自连接以在数据帧中输入NA

时间:2012-06-13 15:01:51

标签: r

我有一个如下所示的数据框:

d <- data.frame(Vessel = c("Hondo", "Whamo", "Hondo", "Delta", "Whamo", "Hondo"),
            PAX = c(250, 252, 249, 353, 252, 250),
            crew = c(35, 63, 36, NA, NA, NA))

我想使用像条件自连接之类的东西来判断NAs,如果框架中有另一行具有相同的Vessel,它会根据相应的行更新工作人员值(如果有多个相应的行,则可以对船员值进行抽样,选择最大/最小......由于船员值不会发生显着变化,因此无关紧要......如果没有相应的记录,则会轮流更新船员(0.25 * PAX)。 我有一种感觉ddply将是去这里的方式,我道歉,因为我无法自己解决这个问题...我无法在任何地方找到这个。我希望最终的data.frame看起来像这样:

VESSEL     PAX     crew
Hondo      250       35
Whamo      252       63
Hondo      249       36
Delta      353       88
Whamo      254       63
Hondo      250       35

注意:PAX和CREW值可能会有所不同(CREW变化很小),因此最后一个“Hondo”CREW值可能是35,36或接近(但它应该基于查找而不是计算)。< / p>

提前致谢, --JT

2 个答案:

答案 0 :(得分:1)

这是使用基础R的解决方案:

transform(merge(d, aggregate(crew ~ ., d, mean), by=1:2, all.x=T, sort=F), 
          crew=ifelse(!is.na(crew.x), crew.x,
                      ifelse(!is.na(crew.y), crew.y, round(0.25 * PAX))))

请注意,mean用于获取每个Vessell / PAX对的唯一值。这可以很容易head(x, 1)或其他任何内容。

答案 1 :(得分:0)

感谢Joran对我措辞不好的问题的回答,我有一个解决方案,虽然是一个丑陋的解决方案......

library(plyr)
d <- data.frame(Vessel = c("Hondo", "Whamo", "Hondo", "Delta", "Whamo", "Hondo"),
            PAX = c(250, 252, 249, 353, 252, 250),
            crew = c(35, 63, 36, NA, NA, NA))
crewlookup <- ddply(subset(d, !is.na(d$crew)), .(Vessel),
                function(x) {
                  x[sample(nrow(x),size=1),]
                })
d2 <- join(d, crewlookup, by="Vessel")
colnames(d2)<-c("Vessel","PAX","crew","PAXl","crewl")
d2$crew <- ifelse(is.na(d2$crew),d2$crewl,d2$crew)
d2 <- within(d2, crew[is.na(crew)] <- round(.25 * PAX[is.na(crew)]) )
d <- subset(d2, select = c("Vessel", "PAX", "crew"))

任何更优雅的东西都会受到赞赏。