我有一个如下所示的数据框:
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
答案 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"))
任何更优雅的东西都会受到赞赏。