R-如何将tidyr / dplyr与查找表配合使用以在其他列中添加匹配数据

时间:2018-07-24 17:27:40

标签: r dplyr tidyr

我想使用查找表通过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的值添加到{{1}与df匹配的新列中的lookupTable$name

df$id

我尝试改编this question中的代码,但收到错误消息:

>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

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

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 

1 个答案:

答案 0 :(得分:1)

我们可能需要选择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