首页 > 解决方案 > R - 如何使用带有查找表的 tidyr/dplyr 在附加列中添加匹配数据

问题描述

我想使用查找表使用 tidyr/dplyr 函数添加带有附加数据的列。我找到了一些执行此操作的基本示例,但无法使其与我的数据一起使用,而且我并没有真正理解这些功能,因为响应没有解释正在发生的事情。

我想匹配此数据框中的 id 列:

>df
            id sample_name       fpkm    conf_hi    conf_lo quant_status
1  XLOC_000118          T1  33.857900  62.323300  5.3925000           OK
2  XLOC_000118          T2 169.793000 395.783000  0.0000000           OK
3  XLOC_000118          T3  41.869200  69.395700 14.3427000           OK
4  XLOC_009095          T1   1.472500   3.076350  0.0000000           OK
5  XLOC_009095          T2   3.828400   8.171850  0.0000000           OK
6  XLOC_009095          T3   1.806010   4.055220  0.0000000           OK

...到此查找表中的相同值并将name值添加到匹配df的新列中:lookupTable$namedf$id

>lookupTable
           id name
1 XLOC_000118 Xy13
2 XLOC_009104  Xy3
3 XLOC_009105  Zy3
4 XLOC_009095  Xy6
5 XLOC_018501  Xy9
6 XLOC_020049 Xy35

我试图调整这个问题的代码,但收到错误:

df %>%
  gather(key = "col") %>% 
  left_join(ObLookup, by = "id") %>%
  spread(key = id, value = name)

Error: `by` can't contain join column `id` which is missing from LHS
In addition: Warning message:
attributes are not identical across measure variables;
they will be dropped 

我自己想出了以下解决方案,它产生了我想要的结果,但我想知道是否有使用 tidyr 或 dplyr 的解决方案:

> df$names <- lookupTable$name[match(df$id, lookupTable$id)]
> df
            id sample_name       fpkm    conf_hi    conf_lo quant_status names
1  XLOC_000118          T1  33.857900  62.323300  5.3925000           OK Obp13
2  XLOC_000118          T2 169.793000 395.783000  0.0000000           OK Obp13
3  XLOC_000118          T3  41.869200  69.395700 14.3427000           OK Obp13
4  XLOC_009095          T1   1.472500   3.076350  0.0000000           OK  Obp6
5  XLOC_009095          T2   3.828400   8.171850  0.0000000           OK  Obp6
6  XLOC_009095          T3   1.806010   4.055220  0.0000000           OK  Obp6

标签: rdplyrtidyr

解决方案


我们可能需要在 中选择感兴趣的列,gather然后在left_join执行spread

library(tidyverse)
df %>%
  gather(key, val, fpkm:conf_lo) %>%
  left_join(lookupTable) %>% 
  spread(key, val)
#         id sample_name quant_status name   conf_hi conf_lo      fpkm
#1 XLOC_000118          T1           OK Xy13  62.32330  5.3925  33.85790
#2 XLOC_000118          T2           OK Xy13 395.78300  0.0000 169.79300
#3 XLOC_000118          T3           OK Xy13  69.39570 14.3427  41.86920
#4 XLOC_009095          T1           OK  Xy6   3.07635  0.0000   1.47250
#5 XLOC_009095          T2           OK  Xy6   8.17185  0.0000   3.82840
#6 XLOC_009095          T3           OK  Xy6   4.05522  0.0000   1.80601

推荐阅读