【问题标题】:Assign new value to database based on value stored in another database根据存储在另一个数据库中的值为数据库分配新值
【发布时间】:2021-01-31 11:36:49
【问题描述】:

在这里,我与您分享我的问题的简化版本。假设我对两个变量有 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

如您所见,33 M 的组合是 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

关于如何解决这个问题的任何建议?任何帮助我都会非常感激!

【问题讨论】:

  • 也许你想要%in%而不是==,即mutate (data, valueA = as.integer (ifelse(data$V1 %in% values$V1 &amp; data$V2 %in% values$V2, values$valueA, NA)) ),或者它是一个简单的连接操作,即left_join(data, values)
  • @akrun 感谢您的回复!不幸的是,代码仍然无法按我的意愿工作......请查看问题中的编辑以获得完整的解释

标签: r if-statement logic multiple-conditions


【解决方案1】:

我解决了上面创建合并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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多