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

4
我有以下数据框:
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"))

那看起来像:

# A tibble: 2 x 4
  sqn   start   end strand
  <chr> <dbl> <dbl> <chr> 
1 FOO       1   531 +     
2 BAR      99     1 -     

我想要做的是在 startend 列中交换值,如果 strand == "-"。期望的结果是这样的:
# A tibble: 2 x 4
  sqn   start   end strand
  <chr> <dbl> <dbl> <chr> 
1 FOO       1   531 +     
2 BAR       1    99 -   

如何实现这个目标?
1个回答

8
一个选项是
df %>% 
  mutate(start1 = ifelse(strand == "-", end, start), 
         end = ifelse(strand =="-", start, end)) %>% 
  select(sqn, start = start1, end, strand)

或者一个更简单的选择是
i1 <- df$strand == "-"
df[i1, c("start", "end")] <- df[i1, c("end", "start")]

嗨@akrun,如果你有许多列,是否有一个选项可以让select自动获取所有其他列,然后只指定start=start1 - Russ Thomas
1
@RussThomas 是的,你可以使用 select(start = start1, everything()) - akrun
3
@RussThomas 因为您正在重命名列,更正确的做法是 select(start = start1, everything(), -start1) - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接