使用dplyr将字符串拆分为逗号分隔的列表

4

我正在尝试使用dplyr将字符串拆分为逗号分隔的字符串,但是我没有太多的运气。

dat<-data.frame(key=1:4,labels=c('a','ab','abc','b'))

我正在尝试将标签列变为c('a','a,b','a,b,c','b')

我尝试了以下所有变体,但似乎都不起作用。

dat %>%
  mutate(labels=str_split(labels,''))

dat %>%
  mutate(labels=str_split(labels,'')[[1]])

dat %>%
  mutate(labels=paste(str_split(labels,''),collapse=','))

2
如果你想要保留列表中的元素(首选),可以使用mutate(dat, labels = strsplit(as.character(labels), "")),或者如果你想要将值转换为非列表形式,则可以使用mutate(dat, labels = sapply(strsplit(as.character(labels), ""), paste, collapse=",")) - lukeA
2个回答

4

dplyrmutate与您的问题无关。您的问题更多地是尝试将由str_split返回的列表视为向量。

我会写一个小函数来解决这个问题:

comma_sep = function(x) {
    x = strsplit(as.character(x), "")
    unlist(lapply(x, paste, collapse = ','))
}

您可以随后执行以下步骤:
mutate(dat, labels = comma_sep(labels))
#   key labels
# 1   1      a
# 2   2    a,b
# 3   3  a,b,c
# 4   4      b

当然,你也可以把函数的主要部分塞到这一行中。


谢谢 Gregor,这是我使用的解决方案。G. Grothendieck,你的解决方案也很好。 - Ben Carlson

4

将每个非边界字符替换为逗号,如下所示:

dat %>% mutate(labels = gsub("\\B", ",", labels, perl = TRUE))

或者使用稍微复杂一些的正则表达式但不需要 perl=TRUE,将每个后面跟着非边界字符的字符替换为该字符后跟逗号:

dat %>% mutate(labels = gsub("(.)\\B", "\\1,", labels))

任选其一,均可得到:

  key labels
1   1      a
2   2    a,b
3   3  a,b,c
4   4      b

太棒了。我一直在尝试使用 \\K,但忘记了 \\B - thelatemail

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