模拟条件自连接以在data.frame中输入NAs

模拟条件自连接以在data.frame中输入NAs,r,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)) VESSEL PAX crew Hondo 250 35 Whamo

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

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

多亏了乔兰对我措辞拙劣的问题的回答,我有了一个解决方案,尽管是一个丑陋的解决方案

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"))
库(plyr)

多亏了乔兰对我措辞拙劣的问题的回答,我有了一个解决办法,尽管这个办法很难看

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"))
库(plyr)

d这里有一个使用基本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))))

请注意,平均值用于获得每个Vessell/PAX对的唯一值。这可能很容易成为头(x,1)
或任何东西。

这里有一个使用base 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))))

请注意,平均值用于获得每个Vessell/PAX对的唯一值。这可能很容易成为
head(x,1)
或任何东西。

每艘船总是只有一个PAX值吗?不,但它可能只会变化10%…使用crew的插补值仍然比计算的插补值更准确…我会相应地更新问题。好的,那么我认为我下面的答案仍然有效(当然,还有未大写的列名).我很抱歉…我本可以创建一个更好的数据框架。我想我已经澄清了要解决的问题。每艘船是否总是只有一个PAX值?不,但它可能只会变化10%…使用crew的插补值仍然比计算的插补值更准确…我会相应地更新问题。好的,那么我认为我的下面的答案应该仍然有效(当然,对于未大写的列名)。很抱歉……我本可以创建一个更好的data.frame。我想我已经澄清了要解决的问题。