我有下表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
我想用ro
中的值更新lc
中的值,以获得以下内容:
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查询的帖子,但所有这些帖子都只是将一个表中的一列与另一个表中的一列进行比较。
这只是一个例子,我实际上有 40 列要更新lc
有数百万行,a
b
c
值可以不同于co
和us
,所以我需要它非常高效。
你可以试试下面的脚本-
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
对于base R
,我们使用命名向量来匹配 'lc' 中字符列中的值,并将这些值替换为来自 'ro' 的相应 'value'
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))