我有一个包含一个字符串列的数据表。我想使用strsplit创建另一列作为此列的子集。
dat <- data.table(labels=c('a_1','b_2','c_3','d_4'))
我想要的输出是
label sub_label
a_1 a
b_2 b
c_3 c
d_4 d
我尝试过以下但似乎都没有效果。
dat %>%
mutate(
sub_labels=strsplit(as.character(labels), "_")[[1]][1]
)
# gives a column whose values are all "a"
这个对我来说似乎合情合理,
dat %>%
mutate(
sub_labels=sapply(strsplit(as.character(labels), "_"), function(x) x[[1]][1])
)
给出错误
错误:不知道如何处理类型pairlist
我看到另一个文章,其中strsplit的输出上的粘贴崩溃工作,所以我不明白为什么匿名函数中的子集会给出问题。感谢您对此的任何澄清。
答案 0 :(得分:18)
tidyr::separate
可以在这里提供帮助:
> dat %>% separate(labels, c("first", "second") )
first second
1: a 1
2: b 2
3: c 3
4: d 4
答案 1 :(得分:2)
另一种方法使用purrr的map_chr,我发现它对我不想打扰分离和联合的应用很有用(例如,在sprintf中将结果与其他字符串一起使用):
tibble(labels=c('a_1','b_2','c_3','d_4')) %>%
mutate(sub_label = stringr::str_split(labels, "_") %>% map_chr(., 1))
答案 2 :(得分:2)
如果我们想一次提取多个列(当然,无需再次运行拆分操作),我们可以将GenesRus的approach与一个临时列合并在一起,并使用负数{{1 }}进一步研究:
select()
截至2020年,绩效为much better than separate()
。
为了完整性,值得一提的是
library(purrr)
library(dplyr)
library(tibble)
library(stringr)
tibble(labels=c('a_1','b_2','c_3','d_4')) %>%
mutate(tmp_chunks = stringr::str_split(labels, fixed("_"), n = 2)) %>%
mutate(sub_label = map_chr(tmp_chunks, 1),
sub_value = map_chr(tmp_chunks, 2)) %>%
select(-tmp_chunks)
可以使用map_chr
参数(以防分隔符在某些行中丢失).default
除去labels