我有下表lc
:
a b c d
co NA co 1
co NA co 84
us co us 6
NA co NA 54
us NA NA 4
还有另一个表ro
d value
bb 1
co 0.5
mn 0.03
us 2
我想用lc
中的值更新ro
中的值以获取以下信息:
a b c d
0.5 NA 0.5 1
0.5 NA 0.5 84
2 0.5 2 6
NA 0.5 NA 54
2 NA NA 4
我有代码:
lc <- sqldf(c("UPDATE lc SET a = (SELECT ro.value FROM ro WHERE lc.a = ro.d)",
"SELECT * FROM main.lc")
)
这显然只会更新列a
,而不会更新其他列。如何更新同一条语句中的其余列?
我看过解决SQL中UPDATE查询的帖子,但所有帖子都只比较一个表中的一列和另一表中的一列。
这只是一个例子,实际上我要在lc
中更新40列,其中包含数百万行,并且a
b
c
的值可以与{{ 1}}和co
,所以我需要它非常有效。
答案 0 :(得分:5)
您可以在脚本下方尝试此操作-
SELECT B.value a,C.value b,D.value c, A.d
FROM lc A
LEFT JOIN ro B ON A.a = B.d
LEFT JOIN ro C ON A.b = C.d
LEFT JOIN ro D ON A.C = D.d
输出为-
a b c d
0.50 NULL 0.50 1
0.50 NULL 0.50 84
2.00 0.50 2.00 6
NULL 0.50 NULL 54
2.00 NULL NULL 4
答案 1 :(得分:0)
使用base R
,我们使用命名向量来匹配“ lc”中字符列中的值,并将这些值替换为“ ro”中对应的“值”
lc[1:3] <- setNames(ro$value, ro$d)[as.matrix(lc[1:3])]
lc
# a b c d
#1 0.5 NA 0.5 1
#2 0.5 NA 0.5 84
#3 2.0 0.5 2.0 6
#4 NA 0.5 NA 54
#5 2.0 NA NA 4
lc <- structure(list(a = c("co", "co", "us", NA, "us"), b = c(NA, NA,
"co", "co", NA), c = c("co", "co", "us", NA, NA), d = c(1L, 84L,
6L, 54L, 4L)), class = "data.frame", row.names = c(NA, -5L))
ro <- structure(list(d = c("bb", "co", "mn", "us"), value = c(1, 0.5,
0.03, 2)), class = "data.frame", row.names = c(NA, -4L))