【问题标题】:Identifying rows in data.frames based on complex rules根据复杂规则识别 data.frames 中的行
【发布时间】:2015-12-09 15:50:04
【问题描述】:

在之前的两个问题中,我问过如何根据复杂的规则识别和提取子字符串:

当前的问题涉及如何在data.frame 结构中实现相同的目的。假设您有一个data.frame,如下所示:

data.frame(time = seq(1:10), 
event = c("FA", "EX", "I1", "FA", "FA", "I3", "EX", "EX", "EX", "I3"), 
actor = c("John", "Alex", "John", "Alex", "Tim", "Sandra", "Sara", "John", "Eliza", "Alex"))

time event actor
1    FA    John
2    EX    Alex
3    I1    John
4    FA    Alex
5    FA    Tim
6    I3    Sandra
7    EX    Sara
8    EX    John
9    EX    Eliza
10   I3    Alex

现在我想从时间 1 移动到 10 并将 I3 之前的所有行分组。这意味着我想返回一个包含两个 data.frame 的列表(第 1-6 行和第 7-10 行应该分别形成一个单独的 data.frame 以放置在一个公共列表中)。我怎样才能做到这一点?

【问题讨论】:

  • @MrFlick:data.frames 列表。谢谢。问题已更新。

标签: regex r dataframe


【解决方案1】:

你可以使用split:

split(dat, c(0, cumsum(dat$event=="I3"))[-(nrow(dat)+1)])

$`0`
  time event  actor
1    1    FA   John
2    2    EX   Alex
3    3    I1   John
4    4    FA   Alex
5    5    FA    Tim
6    6    I3 Sandra

$`1`
   time event actor
7     7    EX  Sara
8     8    EX  John
9     9    EX Eliza
10   10    I3  Alex

【讨论】:

    【解决方案2】:

    这也有效:

    i3.index = which(data$event == "I3")
    i3.start = c(1, i3.index[-length(i3.index)]+1)
    
    indexMatrix = cbind(from = i3.start, end = i3.index)
    
    apply(indexMatrix, 1, function(x){data[x[1]:x[2],]})
    
    # [[1]]
    # time event  actor
    # 1    1    FA   John
    # 2    2    EX   Alex
    # 3    3    I1   John
    # 4    4    FA   Alex
    # 5    5    FA    Tim
    # 6    6    I3 Sandra
    # 
    # [[2]]
    # time event actor
    # 7     7    EX  Sara
    # 8     8    EX  John
    # 9     9    EX Eliza
    # 10   10    I3  Alex
    

    【讨论】:

      【解决方案3】:

      这也可以:

      library(dplyr)
      
      data %>%
        arrange(time %>% desc) %>%
        mutate(group = cumsum(event == "I3")) %>%
        arrange(time) %>%
        group_by(group)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2012-05-13
        • 2011-12-21
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        相关资源
        最近更新 更多