【问题标题】:How to lookup values from code and make some new columns based on it如何从代码中查找值并基于它创建一些新列
【发布时间】:2019-05-28 16:39:53
【问题描述】:

我想从数据库中查找值并在文件中创建一些新列 其实我有一个这样的文件

promo code item stok
sale1  100   a   200
sale2  101   b   300
sale3  102   c   100
sale4  103   d    50

数据库看起来像这样

code item1 code_item1 amount_item1 item2 code_item2 amount_item2 
100   a1     1001          2        a2     1002          1
102   a2     1002          1        a3     1003          1

然后我想在我的第一个文件中添加几列,这些列取自数据库

promo code item stok item1 code_item1 amount_item1 item2 code_item2 amount_item2
sale1  100   a   200   a1     1001          400        a2     1002          200
sale2  101   b   300
sale3  102   c   100   a2     1002          100        a3     1003          100
sale4  103   d    50

我该怎么做?

【问题讨论】:

    标签: r match lookup


    【解决方案1】:

    您可以从dplyr 使用left_join()

    library(dplyr)
    
    my_df <- data.frame(promo = c("sale1", "sale2", "sale3", "sale4"), code = c(100, 101, 102, 103), item = c("a", "b", "c", "d"), stok = c(200, 300, 100, 50))
    db_df <- data.frame(code = c(100, 102), item1 = c("a1", "a2"), code_item1 = c(1001, 1002), amount_item1 = c(2,1), item2 = c("a2", "a3"), code_item2 = c(1002, 1003), amount_item2 = c(1,1))
    
    result_df <- left_join(my_df, db_df, by = c("code" = "code"))
    result_df
    
      promo code item stok item1 code_item1 amount_item1 item2 code_item2 amount_item2
    1 sale1  100    a  200    a1       1001            2    a2       1002            1
    2 sale2  101    b  300  <NA>         NA           NA  <NA>         NA           NA
    3 sale3  102    c  100    a2       1002            1    a3       1003            1
    4 sale4  103    d   50  <NA>         NA           NA  <NA>         NA           NA
    > 
    

    编辑:与您的评论相关,您也可以在left_join之后进行乘法运算,之前不需要这样做:

    result_df$amount_item1 <- result_df$amount_item1 * result_df$stok
    result_df$amount_item2 <- result_df$amount_item2 * result_df$stok
    

    【讨论】:

    • 感谢@sven 为您解答。我昨天忘了对我的问题做一些更新。我想在填充新的合并表之前先用“stok”自动对每个“项目数量”进行计时。脚本中应该修改什么?非常感谢。
    【解决方案2】:

    是的,dplyr 是不错的选择,但是我在这种情况下总是使用merge()

    my_df <- data.frame(promo = c("sale1", "sale2", "sale3", "sale4"), code = c(100, 101, 102, 103), item = c("a", "b", "c", "d"), stok = c(200, 300, 100, 50))
    db_df <- data.frame(code = c(100, 102), item1 = c("a1", "a2"), code_item1 = c(1001, 1002), amount_item1 = c(2,1), item2 = c("a2", "a3"), code_item2 = c(1002, 1003), amount_item2 = c(1,1))
    
    result <- merge(x=my_df, y=db_df, by='code', all.x = TRUE)
    
    > result
      code promo item stok item1 code_item1 amount_item1 item2 code_item2 amount_item2
    1  100 sale1    a  200    a1       1001            2    a2       1002            1
    2  101 sale2    b  300  <NA>         NA           NA  <NA>         NA           NA
    3  102 sale3    c  100    a2       1002            1    a3       1003            1
    4  103 sale4    d   50  <NA>         NA           NA  <NA>         NA           NA
    

    【讨论】:

    • 感谢@Adamm 为您解答。我昨天忘了对我的问题做一些更新。我想在填充新的合并表之前先用“stok”自动对每个“项目数量”进行计时。脚本中应该修改什么?非常感谢。
    • 你能用所需的输出修改问题吗?
    猜你喜欢
    • 2016-02-20
    • 2022-01-15
    • 2021-03-27
    • 2021-09-25
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多