gpt4 book ai didi

r - 更新 df col 值,在另一个 df 中的 col 上使用条件,当两个 df 中的 char col 都可以作为键时

转载 作者:行者123 更新时间:2023-12-04 05:12:04 25 4
gpt4 key购买 nike

我需要有选择地更新 df 列中的值,具体取决于 df2 中列上条件的满足,并提供 df1 的更新值,即 df2 列中的值。两个 df 都有一个 col ,其值是唯一的,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

最佳答案

我会用 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

同样的事情使用 data.table s:
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)]

关于r - 更新 df col 值,在另一个 df 中的 col 上使用条件,当两个 df 中的 char col 都可以作为键时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com