2016-09-06 3 views
-1

Итак, используя простой фрейм данных ниже, я хочу создать новый столбец, который имеет все дни для каждого человека, разделенного точкой с запятой.Работа с пространствами и NA при объединении нескольких столбцов с Tidyr

Например, используя Doug, он должен выглядеть как понедельник; среда; Пятница

Я хотел бы использовать функцию Unite для Tidyr для этого, но когда я его использую, я получаю понедельник, среду, пятницу, из-за NA, что также может быть пустым пространством. Иногда в начале и конце есть полуколоны. Поэтому я надеюсь, что есть способ продолжать «объединять», но улучшать с регулярным выражением, чтобы в итоге я получал каждый день недели, разделенный одной точкой с запятой, и никаких полуколоний в начале или конце.

Я также хотел бы придерживаться Tidyr, Dplyr, Stringr и т.д.

Names<-c("Doug","Ken","Erin","Yuki","John") 
Monday<-c("Monday"," "," ","Monday","Monday") 
Tuesday<-c(" ","Tuesday","Tuesday"," ","Tuesday") 
Wednesday<-c(" ","Wednesday","Wednesday","Wednesday"," ") 
Thursday<-c(" "," "," "," ","Thursday") 
Friday<-c(" "," "," "," ","Friday") 

Days<-data.frame(Monday,Tuesday,Wednesday,Thursday,Friday) 

Days<-Days%>%unite(BestDays,Monday,Tuesday,Wednesday,Thursday,Friday,sep="; ",remove=FALSE) 
+0

https://github.com/hadley/tidyr/issues/203 – Sumedh

ответ

0

От getAnywhere("unite_.data.frame"), соединяйтесь зовет do.call("paste", c(data[from], list(sep = sep))) под капотом, и paste, насколько я знаю, не обеспечивает функциональные возможности опустить NAs, если это вручную не реализовано;

Тем не менее, вы можете использовать обычный метод выражения следующим образом с gsub из базы R, чтобы очистить столбец результата:

gsub("^\\s;\\s|;\\s{2}", "", Days$BestDays) 
# [1] "Monday"       "Tuesday; Wednesday"    
# [3] "Tuesday; Wednesday"    "Monday; Wednesday"     
# [5] "Monday; Tuesday; Thursday; Friday" 

Это удаляет либо ^\\s;\\s шаблон или ;\\s{2} шаблона, бывший обрабатывать случай, когда строка начинается с пробельной строки, где мы можем просто удалить это пространство, и оно будет следующим ;\\s, в противном случае удалите ;\\s{2}, который может обрабатывать случаи, когда \\s находятся как в середине строки, так и в конце строки.

+0

Спасибо за ответ Psidom, но он не работает, когда я пытаюсь. Возможно, это потому, что НС на самом деле не в конечном итоге. Вместо этого он выглядит следующим образом (см. Продолжение ниже ...) – Mike

+0

; Понедельник; среда, пятница или понедельник; среда; пятница; и т. д. Поэтому мне нужно регулярное выражение, чтобы удалить все экземпляры полуколонии в начале или конце, а также экземпляры двойных полуколоней, например ;; Мне также нужно включить gsub в вызов mutate с dplyr для dataframe. – Mike

+0

Привет снова. Я понимаю, что это не сработало, потому что набор данных, на котором я на самом деле работаю, имел пространства вместо NA, поэтому это объясняет. Вот почему в приведенных выше примерах есть только полуколоны вместо NA. Моя вина. Я могу принять ваш ответ выше и создать новый вопрос, если вы предпочитаете, иначе было бы здорово, если бы вы могли показать мне gsub с регулярным выражением для пробелов вместо NA. – Mike