我想使用查找表通过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
答案 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