【问题标题】:Create new column with values indexed from another table使用从另一个表中索引的值创建新列
【发布时间】:2020-12-20 10:42:19
【问题描述】:

我有两张桌子:

表1:

Var1   Var2
01-01  dhold_1
01-01  dhold_2
01-01  dhold_3
02-01  dhold_1
02-01  dhold_2
03-01  dhold_3

表2:

md      dhold_1   dhold_2   dhold_3
01-01   1.01      1.05      1.04
02-01   1.03      0.09      0.99

我想在 table1 中创建一个新列,我们称之为Var3。 新列应包含表 2 中的相应值。我想您在查看最终结果时应该知道我的意思:

添加新列(目标)后的table1:

Var1   Var2      Var3
01-01  dhold_1   1.01
01-01  dhold_2   1.05
01-01  dhold_3   1.04
02-01  dhold_1   1.03
02-01  dhold_2   0.09
03-01  dhold_3   0.99

我在 R 中尝试了以下内容:

table1$Var3 <- table2[match(table1$Var1,table2$md),match(table1$Var2,colnames(table2))]

上面的代码在某种程度上产生了我想要的输出,put 不仅创建了 1 个新列,而且还创建了 n 新列,每个列都包含相同的内容。鉴于我有一个更大的文件,它最终以vector allocation error 结尾。

我花了几个小时寻找解决方案。有人有想法吗?提前非常感谢。

【问题讨论】:

    标签: r indexing lookup


    【解决方案1】:

    以长格式获取table2,然后加入。

    library(dplyr)
    library(tidyr)
    
    table2 %>%
      pivot_longer(cols = -md) %>%
      right_join(table1, by = c('md' = 'Var1', 'name' = 'Var2'))
    
    #   md    name    value
    #  <chr> <chr>   <dbl>
    #1 01-01 dhold_1  1.01
    #2 01-01 dhold_2  1.05
    #3 01-01 dhold_3  1.04
    #4 02-01 dhold_1  1.03
    #5 02-01 dhold_2  0.09
    #6 02-01 dhold_3  0.99 
    

    数据

    我认为table1 的最后一个值应该是02-01 ?我更正了这一点并在数据中使用了它。

    table1 <- structure(list(Var1 = c("01-01", "01-01", "01-01", "02-01", "02-01", 
    "02-01"), Var2 = c("dhold_1", "dhold_2", "dhold_3", "dhold_1", 
    "dhold_2", "dhold_3")), class = "data.frame", row.names = c(NA, -6L))
    
    table2 <- structure(list(md = c("01-01", "02-01"), dhold_1 = c(1.01, 1.03
    ), dhold_2 = c(1.05, 0.09), dhold_3 = c(1.04, 0.99)), 
    class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2015-09-25
      • 2018-07-28
      • 2020-05-07
      相关资源
      最近更新 更多