根据存储在另一个数据库中的值向数据库分配新值
Assign new value to database based on value stored in another database
在这里,我与您分享我的问题的简化版本。假设我有两个变量的 6 个观察值 (pid):
pid <- c(1,2,3,4,5,6)
V1 <- c(11,11,33,11,22,33)
V2 <- c("A", "C", "M", "M", "A", "A")
data <- data.frame(pid, V1, V2)
# pid V1 V2
# 1 1 11 A
# 2 2 11 C
# 3 3 33 M
# 4 4 11 M
# 5 5 22 A
# 6 6 33 A
我想根据与 V1 和 V2 的不同组合关联的值创建一个新列,该列存储在第二个数据库中:
V1 <- c(11,11,11,22,22,22,33,33,33)
V2 <- c("A", "C", "M","A", "C", "M","A", "C", "M")
valueA <- c(16,26,36,46,56,66,76,86,96)
valueB <- c(15,25,35,45,55,65,75,85,95)
values <- data.frame(V1, V2, valueA, valueB)
# V1 V2 valueA valueB
# 1 11 A 16 15
# 2 11 C 26 25
# 3 11 M 36 35
# 4 22 A 46 45
# 5 22 C 56 55
# 6 22 M 66 65
# 7 33 A 76 75
# 8 33 C 86 85
# 9 33 M 96 95
我按照@akrun 的建议试过了:
data <- mutate (data,
valueA = as.integer (ifelse(data$V1 %in% values$V1
& data$V2 %in% values$V2, values$valueA, NA))
)
但结果如下:
# pid V1 V2 valueA
# 1 1 11 A 16
# 2 2 11 C 26
# 3 3 33 M 36
# 4 4 11 M 46
# 5 5 22 A 56
# 6 6 33 A 66
如你所见,33M的组合是36,而应该是96...
我想存档:
# pid V1 V2 valueA
# 1 1 11 A 16
# 2 2 11 C 26
# 3 3 33 M 96
# 4 4 11 M 36
# 5 5 22 A 46
# 6 6 33 A 76
关于如何解决这个问题有什么建议吗?任何帮助我将不胜感激!
我解决了上面的问题,创建了一个合并 V1 和 V2 的列,如下所示:
data$unique <- paste(data$V1,data$V2)
values$unique <- paste(values$V1, values$V2)
然后由新列合并:
merge(x = data, y = values, by = "unique")
# unique pid V1.x V2.x V1.y V2.y valueA valueB
# 1 11 A 1 11 A 11 A 16 15
# 2 11 C 2 11 C 11 C 26 25
# 3 11 M 4 11 M 11 M 36 35
# 4 22 A 5 22 A 22 A 46 45
# 5 33 A 6 33 A 33 A 76 75
# 6 33 M 3 33 M 33 M 96 95
在这里,我与您分享我的问题的简化版本。假设我有两个变量的 6 个观察值 (pid):
pid <- c(1,2,3,4,5,6)
V1 <- c(11,11,33,11,22,33)
V2 <- c("A", "C", "M", "M", "A", "A")
data <- data.frame(pid, V1, V2)
# pid V1 V2
# 1 1 11 A
# 2 2 11 C
# 3 3 33 M
# 4 4 11 M
# 5 5 22 A
# 6 6 33 A
我想根据与 V1 和 V2 的不同组合关联的值创建一个新列,该列存储在第二个数据库中:
V1 <- c(11,11,11,22,22,22,33,33,33)
V2 <- c("A", "C", "M","A", "C", "M","A", "C", "M")
valueA <- c(16,26,36,46,56,66,76,86,96)
valueB <- c(15,25,35,45,55,65,75,85,95)
values <- data.frame(V1, V2, valueA, valueB)
# V1 V2 valueA valueB
# 1 11 A 16 15
# 2 11 C 26 25
# 3 11 M 36 35
# 4 22 A 46 45
# 5 22 C 56 55
# 6 22 M 66 65
# 7 33 A 76 75
# 8 33 C 86 85
# 9 33 M 96 95
我按照@akrun 的建议试过了:
data <- mutate (data,
valueA = as.integer (ifelse(data$V1 %in% values$V1
& data$V2 %in% values$V2, values$valueA, NA))
)
但结果如下:
# pid V1 V2 valueA
# 1 1 11 A 16
# 2 2 11 C 26
# 3 3 33 M 36
# 4 4 11 M 46
# 5 5 22 A 56
# 6 6 33 A 66
如你所见,33M的组合是36,而应该是96...
我想存档:
# pid V1 V2 valueA
# 1 1 11 A 16
# 2 2 11 C 26
# 3 3 33 M 96
# 4 4 11 M 36
# 5 5 22 A 46
# 6 6 33 A 76
关于如何解决这个问题有什么建议吗?任何帮助我将不胜感激!
我解决了上面的问题,创建了一个合并 V1 和 V2 的列,如下所示:
data$unique <- paste(data$V1,data$V2)
values$unique <- paste(values$V1, values$V2)
然后由新列合并:
merge(x = data, y = values, by = "unique")
# unique pid V1.x V2.x V1.y V2.y valueA valueB
# 1 11 A 1 11 A 11 A 16 15
# 2 11 C 2 11 C 11 C 26 25
# 3 11 M 4 11 M 11 M 36 35
# 4 22 A 5 22 A 22 A 46 45
# 5 33 A 6 33 A 33 A 76 75
# 6 33 M 3 33 M 33 M 96 95