2

df2の列の条件の満足度に応じて、df列の値を選択的に更新し、df1の更新値としてdf2の列の値を提供する必要があります。両方のdfには、値が一意である列があり、df2の一意は、df1の一意のサブセットです。私が試したアプローチは、両方のdfの一意の列の値を取得し、それらを行名に変換し、それらを使用して、df2から作成され、値の更新のためにdf1に適用される選択インデックスを定義することです。行の文字ベースの共有キーインデックスと組み合わせて、数値の添え字を使用して列を定義することにより、構文が機能するようになりました(最終的には!)。ふぅ。

しかし、おそらく組み込みを使用して、私が試みている方法よりも簡単で、効率的で、より「R」の方法がありますか?スケーリングする必要があります。テスト例は次のとおりです。

goo <- data.frame(Uids=c("UidD", "UidA", "UidC"), Payout=c(3,0,5), stringsAsFactors = FALSE)
moo <- data.frame(Uids=c("UidB", "UidC", "UidA", "UidD"), PayOut=0, stringsAsFactors = FALSE)
goo
  Uids Payout
1 UidD      3
2 UidA      0
3 UidC      5
moo
  Uids PayOut
1 UidB      0
2 UidC      0
3 UidA      0
4 UidD      0
# I want to update moo$Payout with the value of goo$Payout, for matching Uids,
# when goo$Payout > 0, i.e. moo[4,2] <- goo[1,2]; moo[2,2 <- goo[3,2]
rownames(goo) <- goo$Uids
rownames(moo) <- moo$Uids
#I am trying to create and apply an index based on turning uids into rownames
IndexToUpdate <- goo$Uids[goo$Payout>0]
IndexToUpdate
[1] "UidD" "UidC"
 moo[IndexToUpdate, 2] <- goo[IndexToUpdate, 2]
#this works, but is there a better way to do it?
moo
     Uids PayOut
UidB UidB      0
UidC UidC      5
UidA UidA      0
UidD UidD      3
4

1 に答える 1

3

私はで使用mergeall.x = TRUEます:

voo <- merge(moo, goo, by = "Uids", all.x = TRUE)
voo
#   Uids PayOut.x PayOut.y
# 1 UidA        0        0
# 2 UidB        0       NA
# 3 UidC        0        5
# 4 UidD        0        3

次にifelse

within(voo, PayOut <- ifelse(is.na(PayOut.y), PayOut.x, PayOut.y))
#   Uids PayOut.x PayOut.y PayOut
# 1 UidA        0        0      0
# 2 UidB        0       NA      0
# 3 UidC        0        5      5
# 4 UidD        0        3      3

sを使用して同じことdata.table

library(data.table)
GOO <- data.table(goo)
MOO <- data.table(moo)
setkey(GOO, Uids)
setkey(MOO, Uids)
VOO <- GOO[MOO]
VOO[, FinalPayout := ifelse(is.na(PayOut), PayOut.1, PayOut)]
于 2013-02-10T13:45:57.523 に答える