2016-06-01 3 views
3

Я пытаюсь использовать dplyr, чтобы разделить строку на запятую, и мне не повезло.dplyr split string в список, разделенный запятой

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

Я пытаюсь получить столбец метки, чтобы быть с («а», «а, Ь», «а, Ь, с», «б»)

Я пробовал все приведенные ниже варианты, но ничего не работает.

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

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

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

Как 'мутировать (Дат, лейблы = strsplit (as.charac ter (метки), "")) ', если вы хотите сохранить элементы в списке (предпочтительнее) или' mutate (dat, labels = sapply (strsplit (as.character (labels), ""), вставить, свернуть = ",")) ', если вы хотите изменить значения? – lukeA

ответ

4

dplyr или mutate не имеет ничего общего с вашим вопросом. Ваши проблемы больше похожи на попытку обработки списка (возвращенного 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 

Но, конечно, вы могли бы заклинить мясо функции в этой одной линии, а также.

+0

Спасибо, Грегор, это решение, которое я использовал. Г. Гротендик, ваше решение было также хорошим. –

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 
+0

Это великолепно. Я наполнил '\\ K', но забыл о' \\ B'. – thelatemail

Смежные вопросы