2016-09-06 51 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