2016-09-06 78 views
-1

因此,使用下面的簡單數據框,我想創建一個新列,每個人的所有日期都用分號分隔。與Tidyr合併多列時處理空格和NA的問題

例如,使用Doug,應該看起來像 - 星期一;星期三;星期五

我想使用Tidyr的Unite函數,但是當我使用它時,我得到 - 星期一;;星期三;;星期五,因爲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據我所知沒有提供的功能省略NA,除非以某種方式手動實施;

然而,可以用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,但它似乎並沒有工作,當我嘗試它。也許這是因爲NA不是最終結果。相反,它看起來像(見下面的延續...) – Mike

+0

;星期一;;星期三;星期五或星期一;;星期三;星期五;等等......所以我需要一個正則表達式來刪除開頭或結尾的所有分號的實例,以及雙分號的實例,例如;;我還需要將gsub與dplyr的數據框進行mutate調用。 – Mike

+0

再次嗨。我意識到這是行不通的,因爲我實際上正在處理的數據集有空格而不是NA,所以這可以解釋它。所以這就是爲什麼上面評論中的例子只有分號而不是NA。我的錯。如果您願意,我可以接受您的答案並創建一個新問題,否則如果您可以使用正則表達式爲空來顯示gsub而不是NA,那將會很棒。 – Mike