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を代入したいと思います(対応する行が複数ある場合は、乗組員の値、最大/最小を選択...乗組員の値は劇的に変化しないので問題ありません...対応するレコードがない場合は、ラウンドごとに乗組員を更新します(0.25 * PAX)。ここに行く方法であり、これを自分で理解できなかったことをお詫びします...これでどこにでも行くのに問題があります。最終的な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))))

Vessel/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 に答える