我希望使用其他数据表中的信息更新一个数据表中的字段,如下所示:
dt1$name <- dt2$name where dt1$id = dt2$id
In SQL pseudo code : update dt1 set name = dt2.name where dt1.id = dt2.id
正如你所看到的,我对R很新,所以每一点都有帮助。
更新 我认为这是我的错 - 如果两个数据帧的用户名匹配,我真正想要的是更新电话号码。
那么,如果两个名称匹配,我如何比较名称并更新字段? 请帮助:)
dt1$phone<- dt2$phone where dt1$name = dt2$name
答案 0 :(得分:2)
尝试:
dt1$name <- ifelse(dt1$id == dt2$id, dt2$name, dt1$name)
或者,也许:
dt1$name[dt1$id == dt2$id] <- dt2$name[dt1$id == dt2$id]
答案 1 :(得分:2)
Joran的回答假定dt1
和dt2
可以按位置匹配。
如果不是这样,您可能需要先merge()
:
dt1 <- data.frame(id = c(1, 2, 3), name = c("a", "b", "c"), stringsAsFactors = FALSE)
dt2 <- data.frame(id = c(7, 3), name = c("f", "g"), stringsAsFactors = FALSE)
dt1 <- merge(dt1, dt2, by = "id", all.x = TRUE)
dt1$name <- ifelse( ! is.na(dt1$name.y), dt1$name.y, dt1$name.x)
dt1
(根据您的更新编辑:
dt1 <- data.frame(id = c(1, 2, 3), name = c("a", "b", "c"), phone = c("123-123", "456-456", NA), stringsAsFactors = FALSE)
dt2 <- data.frame(name = c("f", "g", "a"), phone = c(NA, "000-000", "789-789"), stringsAsFactors = FALSE)
dt1 <- merge(dt1, dt2, by = "name", all.x = TRUE)
dt1$new_phone <- ifelse( ! is.na(dt1$phone.y), dt1$phone.y, dt1$phone.x)
答案 2 :(得分:1)
如果您更适合在SQL中工作,可以使用sqldf
包:
dt1 <- data.frame(id = c(1, 2, 3),
name = c("A", "B", "C"),
stringsAsFactors = FALSE)
dt2 <- data.frame(id = c(2, 3, 4),
name = c("X", "Y", "Z"),
stringsAsFactors = FALSE)
library(sqldf)
sqldf("SELECT dt1.id,
CASE WHEN dt2.name IS NULL THEN dt1.name ELSE dt2.name END name
FROM dt1
LEFT JOIN dt2
ON dt1.id = dt2.id")
但是,从计算上来说,它比joran的解决方案慢了大约150倍,而且人类时间也慢了很多。但是,如果您处于绑定状态并且只需要执行可以在SQL中轻松完成的操作,那么它就是一种选择。