如何解决如何在 R 中自动执行这个简单的条件列操作?
我有一个如下所示的数据框:
tibble(term = c(
rep("a:b",2),rep("b:a",rep("c:d",rep("d:c",rep("g:h",rep("h:g",2)
))
我想在此数据框中添加一个额外的列,该列对于具有相同字符但反转并以“:”分隔的任何对都具有相同的值(即 a:b 和 b:a 将被编码相同的方式;对于 c:d 和 d:c 以及所有其他对都类似)。
我想到了以下内容:
%>%
mutate(term_adjusted = case_when(grepl("a:b|b:a",term) ~ "a:b"))
但是我的数据集中有大量这些对,并且想要一种自动化的方法,因此我的问题是:
如何自动执行此操作而不必为每对单独进行硬编码?
谢谢!
解决方法
怎么样:
libary(dplyr)
your_data %>%
mutate(term_adjusted = term %>%
strsplit(":") %>%
purrr::map_chr(~ .x %>%
sort() %>%
paste(collapse = ":")))
基础 R 选项
your_data$term_adjusted <- your_data$term |>
strsplit(":") |>
lapply(sort) |>
lapply(paste,collapse = ":") |>
unlist()
要么返回:
# A tibble: 12 x 2
term term_adjusted
<chr> <chr>
1 a:b a:b
2 a:b a:b
3 b:a a:b
4 b:a a:b
5 c:d c:d
6 c:d c:d
7 d:c c:d
8 d:c c:d
9 g:h g:h
10 g:h g:h
11 h:g g:h
12 h:g g:h
,
tidyverse
选项 -
library(dplyr)
library(tidyr)
df %>%
separate(term,c('term1','term2'),sep = ':',remove = FALSE) %>%
mutate(col1 = pmin(term1,term2),col2 = pmax(term1,term2)) %>%
unite(result,col1,col2,sep = ':') %>%
select(term,result)
# term result
# <chr> <chr>
# 1 a:b a:b
# 2 a:b a:b
# 3 b:a a:b
# 4 b:a a:b
# 5 c:d c:d
# 6 c:d c:d
# 7 d:c c:d
# 8 d:c c:d
# 9 g:h g:h
#10 g:h g:h
#11 h:g g:h
#12 h:g g:h
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。