【问题标题】:Subsetting data frame returns empty data frame子集数据框返回空数据框
【发布时间】:2019-02-04 16:28:29
【问题描述】:

我知道这表明该问题已在此处提出/回答:(R) [] / subset() returns an empty data frame 但它没有我正在寻找的解决方案。 (我的列没有填充空白)

这是我的原始数据

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

我做错了什么?谢谢!

【问题讨论】:

  • 能否列出包依赖关系?
  • 无法重现问题,即我得到了输出
  • @akrun 我得到一个数据框,但是它没有被命名为“events2”,当我在脚本中输入events2 时它也没有出现
  • 我收到events %&gt;% select(County, ID, event, contains("row")) %&gt;% gather(m, event, contains('row')) %&gt;% select(-m) %&gt;% head# County ID event 1 Rogers 1 Plea 2 Rogers 2 Application
  • 您是否需要和events2 一样的两个事件?还是你只想要events2

标签: r


【解决方案1】:

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

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

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

简而言之,在gather() 函数中对matches() 的调用表示:匹配'row' 或匹配'event',当它后跟至少一个介于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。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2018-04-26
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2021-10-20
    • 1970-01-01
    • 2022-07-22
    相关资源
    最近更新 更多