在dplyr和mutate中使用strsplit和subset

时间:2017-03-02 20:41:34

标签: r dplyr strsplit

我有一个包含一个字符串列的数据表。我想使用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的输出上的粘贴崩溃工作,所以我不明白为什么匿名函数中的子集会给出问题。感谢您对此的任何澄清。

3 个答案:

答案 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)

如果我们想一次提取多个列(当然,无需再次运行拆分操作),我们可以将GenesRusapproach与一个临时列合并在一起,并使用负数{{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