如何使用dplyr使用查找表重命名包含列名的空格

时间:2017-10-11 01:01:56

标签: r dplyr

我有以下数据框。要替换的列名称包含空格。所以这与以前的帖子不同。


library(tidyverse)

dat <- tribble(
  ~group, ~y, ~`ARE(NR)/LNCAP-AR-ChIP-Seq(GSE27824)/Homer Best Motif log-odds Score`, ~`Znf263/K562-Znf263-ChIP-Seq/Homer Best Motif log-odds Score` ,
  "group_1",  "foo", 10,  3, 
  "group_2",  "bar", 700, 4,
  "group_2",  "qux", 150, 5
)

dat 
#> # A tibble: 3 x 4
#>     group     y
#>     <chr> <chr>
#> 1 group_1   foo
#> 2 group_2   bar
#> 3 group_2   qux
#> # ... with 2 more variables: `ARE(NR)/LNCAP-AR-ChIP-Seq(GSE27824)/Homer
#> #   Best Motif log-odds Score` <dbl>, `Znf263/K562-Znf263-ChIP-Seq/Homer
#> #   Best Motif log-odds Score` <dbl>

lookup_dat <- tribble(
  ~old, ~new,
  'ARE(NR)/LNCAP-AR-ChIP-Seq(GSE27824)/Homer Best Motif log-odds Score', 'ARE',
  'Znf263/K562-Znf263-ChIP-Seq/Homer Best Motif log-odds Score', 'Znf263'
)

用于转换列名的查找表。如果dat中的列名称未包含在lookup_dat$old中,则保留列名称。

lookup_dat
#> # A tibble: 2 x 2
#>                                                                   old
#>                                                                 <chr>
#> 1 ARE(NR)/LNCAP-AR-ChIP-Seq(GSE27824)/Homer Best Motif log-odds Score
#> 2         Znf263/K562-Znf263-ChIP-Seq/Homer Best Motif log-odds Score
#> # ... with 1 more variables: new <chr>

我希望得到的最终新数据框是:

  group      y   ARE Znf263
  group_1  foo    10    3 
  group_2  bar   700    4
  group_2  qux   150    5

我该怎么做?

我试过这个,但是有错误:

> dat %>% 
+   rename_(.dots=with(lookup_dat, setNames(as.list(as.character(old)), new)))
Error in parse(text = x) : <text>:1:43: unexpected symbol
1: ARE(NR)/LNCAP-AR-ChIP-Seq(GSE27824)/Homer Best
                                              ^

2 个答案:

答案 0 :(得分:1)

rename UQS (或 !!! )一起使用; setNames(lookup_dat$old, lookup_dat$new)创建一个从旧名称到新名称的命名向量映射, !!! 将向量拼接为rename的单独参数:

rename(dat, !!!setNames(lookup_dat$old, lookup_dat$new))

# A tibble: 3 x 4
#    group     y   ARE Znf263
#    <chr> <chr> <dbl>  <dbl>
#1 group_1   foo    10      3
#2 group_2   bar   700      4
#3 group_2   qux   150      5

答案 1 :(得分:1)

还可以使用tidyr来gather所有麻烦的列名,然后与查找表合并,spread使用新的列名:

dat.long <- gather(dat, column, value, -group, -y) %>% 
  left_join(lookup_dat, by = c(column = 'old')) %>% 
  select(-column) %>% 
  spread(new, value)

# A tibble: 3 × 4
    group     y   ARE Znf263
*   <chr> <chr> <dbl>  <dbl>
1 group_1   foo    10      3
2 group_2   bar   700      4
3 group_2   qux   150      5