使用来自一个 table 的多列和来自另一个 table 的单列更新值
Update values using multiple columns from one table and a single column from another table
我有以下 table 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
还有一个tablero
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 查询的帖子,但所有帖子都只是将一列 table 的一列与另一列 table 的一列进行比较。
这只是一个示例,实际上我在 lc
中有 40 列要更新,有数百万行,并且 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))
我有以下 table 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
还有一个tablero
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 查询的帖子,但所有帖子都只是将一列 table 的一列与另一列 table 的一列进行比较。
这只是一个示例,实际上我在 lc
中有 40 列要更新,有数百万行,并且 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))