1

我有一个看起来像这样的数据框:

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))

我想使用条件自连接之类的东西来估算 NA,如果框架中有另一行具有相同的 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 或接近的值(但它应该基于查找而不是计算)。

提前致谢,--JT

4

2 回答 2

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))))

请注意,平均值用于获取每个 Vesell/PAX 对的唯一值。这可能很容易head(x, 1)或其他。

于 2012-06-13T23:33:35.463 回答
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"))

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

于 2012-06-13T16:33:40.333 回答