gpt4 book ai didi

r - 执行此加入/合并的 "data table"方法是什么?

转载 作者:行者123 更新时间:2023-12-04 02:32:35 27 4
gpt4 key购买 nike

我有一个像这样的“字典”表:

dict <- data.table(
Nickname = c("Abby", "Ben", "Chris", "Dan", "Ed"),
Name = c("Abigail", "Benjamin", "Christopher", "Daniel", "Edward")
)
dict
# Nickname Name
# 1: Abby Abigail
# 2: Ben Benjamin
# 3: Chris Christopher
# 4: Dan Daniel
# 5: Ed Edward

还有一个像这样的“数据”表:

dat <- data.table(
Friend1 = c("Abby", "Ben", "Ben", "Chris"),
Friend2 = c("Ben", "Ed", NA, "Ed"),
Friend3 = c("Ed", NA, NA, "Dan"),
Friend4 = c("Dan", NA, NA, NA)
)
dat
# Friend1 Friend2 Friend3 Friend4
# 1: Abby Ben Ed Dan
# 2: Ben Ed NA NA
# 3: Ben NA NA NA
# 4: Chris Ed Dan NA

我想生成一个像这样的data.table

result <- data.table(
Friend1.Nickname = c("Abby", "Ben", "Ben", "Chris"),
Friend1.Name = c("Abigail", "Benjamin", "Benjamin", "Christopher"),
Friend2.Nickname = c("Ben", "Ed", NA, "Ed"),
Friend2.Name = c("Benjamin", "Edward", NA, "Edward"),
Friend3.Nickname = c("Ed", NA, NA, "Dan"),
Friend3.Name = c("Edward", NA, NA, "Daniel"),
Friend4.Nickname = c("Dan", NA, NA, NA),
Friend4.Name = c("Daniel", NA, NA, NA)
)
result
# sorry, word wrapping makes this too annoying to copy

这是我想到的解决方案:

friend_vars <- paste0("Friend", 1:4)
friend_nicks <- paste0(friend_vars, ".Nickname")
friend_names <- paste0(friend_vars, ".Name")
setnames(dat, friend_vars, friend_nicks)
for (i in 1:4) {
dat[, friend_names[i] := dict$Name[match(dat[[friend_nicks[i]]], dict$Nickname)], with = FALSE]
}

是否有更“数据表式”的方式来做到这一点?我敢肯定它既好又高效,但读起来很难看,而且从 data.table 的就地分配来看,我觉得我没有充分利用这个包必须提供。

我也不是一个非常熟练的 SQL 用户,而且我不太熟悉连接术语。我有一种感觉 Data.table - left outer join on multiple tables在这里可能会有用,但我不确定如何将它应用到我的情况。

最佳答案

使用 data.table 1.9.5:

for (nm in names(dat)) {
on = setattr("Nickname", 'names', nm)
dat[dict, paste0(nm, ".Name") := i.Name, on=on]
}

我们可以使用 on= 而不是设置 key 来加入。现在您可以使用 setcolorder() 对名称重新排序。

除非绝对必要,否则我会避免 reshape 数据。这就是加入时更新 真正派上用场的地方。现在有了 on= 参数,我忍不住发布了一个答案:-)。

关于r - 执行此加入/合并的 "data table"方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32316754/

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