我有以下数据框。要替换的列名称包含空格。所以这与以前的帖子不同。
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
^
答案 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