如何更新R中的数据框字段?

时间:2016-10-13 16:41:05

标签: r dataframe

我希望使用其他数据表中的信息更新一个数据表中的字段,如下所示:

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

3 个答案:

答案 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的回答假定dt1dt2可以按位置匹配。

如果不是这样,您可能需要先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中轻松完成的操作,那么它就是一种选择。