如何使用dplyr同时交换两列中的值

sca*_*der 0 r dplyr tidyverse

我有以下数据框:

df <- structure(list(sqn = c("FOO", "BAR"), start = c(1, 99), end = c(531, 
1), strand = c("+", "-")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

看起来像:

# A tibble: 2 x 4
  sqn   start   end strand
  <chr> <dbl> <dbl> <chr> 
1 FOO       1   531 +     
2 BAR      99     1 -     
Run Code Online (Sandbox Code Playgroud)

我想做的是交换if startendcolumn中的值strand == "-"。期望的结果是这样的:

# A tibble: 2 x 4
  sqn   start   end strand
  <chr> <dbl> <dbl> <chr> 
1 FOO       1   531 +     
2 BAR       1    99 -   
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

akr*_*run 5

一个选择是

df %>% 
  mutate(start1 = ifelse(strand == "-", end, start), 
         end = ifelse(strand =="-", start, end)) %>% 
  select(sqn, start = start1, end, strand)
Run Code Online (Sandbox Code Playgroud)

或更简单的选择是

i1 <- df$strand == "-"
df[i1, c("start", "end")] <- df[i1, c("end", "start")]
Run Code Online (Sandbox Code Playgroud)

  • @RussThomas因为您正在重命名该列,更正确的是`select(start = start1, everything(), -start1)` (2认同)