子集数据帧返回空数据帧

时间:2018-08-29 19:39:04

标签: r

我知道它表明已经在这里{/ {3}}处提出/回答了这个问题,但没有我要找的解决方案。 (我的列没有填充空格)

这是我的原始数据

head(d)
County    ID     event1       event2         row1           row2  
Rogers    1      Hearing      Application    Plea           Trial
Rogers    2      Arrest       Hearing        Application    Plea
Rogers    3      Arrest       Hearing        Plea           Disposal

我需要事件和行列全部都存在于一行中。

events <- d %>%
  select(County, ID, contains("event"), contains("row")) %>%
  gather(m, event, contains("event")) %>%
  filter(!is.na(event)) %>%
  select(-m)

 head(events)
 County     ID     event        row1         row2
 Rogers     1      Hearing      Plea         Trial
 Rogers     1      Application  Plea         Trial
 Rogers     2      Arrest       Application  Plea
 Rogers     2      Hearing      Application  Plea

我仍然需要将行列作为事件。

events2 <- events %>%
  select(County, ID, event, contains("row")) %>%
  gather(m, event, contains("row")) %>%
  filter(!is.na(event)) %>%
  select(-m)

我希望它看起来像这样。

head(events2)
County      ID        event
Rogers      1         Hearing
Rogers      1         Application
Rogers      1         Plea
Rogers      1         Trial

但是相反,它返回了一个带有0个观察值的空数据帧。

events2
NULL

我在做什么错?谢谢!

1 个答案:

答案 0 :(得分:0)

类似于评论中提到的内容,即使复制/粘贴代码,我也无法重现您的问题。也就是说,我得到了预期的输出。但是我有一个可能会有所帮助的解决方案。

也许您可以通过进行一轮管道传输来缓解问题,而不是使用正则表达式版本contains()来匹配'matches()row'来使用'event',有效地将列标题与“行”和“事件”匹配。这消除了必须运行两次管道程序的时间,在这种情况下,使用复制粘贴更改方法可能会出错(我知道我一直都在犯错误)。

events <- d %>% 
  select(County,ID,matches('event|row')) %>% 
  gather(m,event,matches('row|event[0-9]+')) %>% 
  select(-m) %>%
  filter(!is.na(event))

简而言之,在matches()函数中对gather()的调用说:匹配“行”或匹配“事件”,当其后跟随至少一个0到9之间的数字。有关更多信息,请参见此整洁的图形:Regular Expressions in R

我必须在此之后对data.frame进行排序,但是随后我得到了:

>head(events)
  County ID       event
  Rogers  1     Hearing
  Rogers  1 Application
  Rogers  1        Plea
  Rogers  1       Trial
  Rogers  2      Arrest
  Rogers  2     Hearing

我正在使用tidyverse v1.2.1。希望有帮助!