如何解决tidyverse跨列连接字符不适用于c_across
我有以下数据:
dat <- data.frame(sheet = c("a","b","c"),condition1 = c("k","l","m"),condition2 = c("x","y","z"))
我现在想使用连接这些列的tidyverse创建一个新列。但是,我总是会出错。
library(tidyverse)
new_dat %>%
rowwise() %>%
mutate(marker = str_c(c_across(c(sheet,starts_with("condition"))),sep = "/")) %>%
ungroup()
Error: Problem with `mutate()` input `marker`.
x Input `marker` can't be recycled to size 1.
i Input `marker` is `str_c(c_across(c(sheet,sep = "/")`.
i Input `marker` must be size 1,not 3.
i Did you mean: `marker = list(str_c(c_across(c(sheet,sep = "/"))` ?
i The error occurred in row 1.
有什么建议/帮助吗?
预期输出:
sheet condition1 condition2 marker
1 a k x a/k/x
2 b l y b/l/y
3 c m z c/m/z
注意:我alyo在不使用按行部分并且不使用across
而不是c_across
的情况下尝试了代码(并调整了跨语法),但是我遇到了类似的错误。将str_c
替换为paste0
也不起作用。
编辑:因为它不添加任何值,所以从输入数据中删除了x列。
解决方法
结合使用dplyr
和purrr
,您可以执行以下操作:
dat %>%
mutate(marker = pmap(across(c(sheet,starts_with("condition"))),paste,sep = "/"))
sheet condition1 condition2 x marker
1 a k x 1 a/k/x
2 b l y 2 b/l/y
3 c m z 3 c/m/z
,
使用collapse
,而不是sep
:
dat %>%
rowwise() %>%
mutate(marker = str_c(c_across(c(sheet,collapse = "/")) %>%
ungroup()
# A tibble: 3 x 5
sheet condition1 condition2 x marker
<fct> <fct> <fct> <dbl> <chr>
1 a k x 1 a/k/x
2 b l y 2 b/l/y
3 c m z 3 c/m/z
通过这个简单的示例,您可以看到sep
和collapse
之间的区别(显示起来比解释容易):
str_c(letters[1:3],letters[4:6],sep = "_")
# "a_d" "b_e" "c_f"
str_c(letters[1:3],collapse = "_")
# "ad_be_cf"
,
您可以使用tidyr
的{{1}}:
unite
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。