2017-01-10 125 views
0

我有一个数据框,它包含发生随机事件的次数。我想要的是当事件下出现“地点”或“显示”,并结合事件2下出现的“踢”或“类型”时,将第一种情况子集。因此,在这种情况下,“地点运行”不会满足即使“地点”确实出现在“事件”下。当我说第一个案例时,我只想要第一个案例,其中任何一个选项在时间重置为0之前发生。因此,对于第一个片段,我想要的输出是27,因为这是第一个时间值条件得到满足。对于第二部分,我想要16个。对于最后一个部分,输出将是41.(我已经将满足条件的行放在周围,以便它们很容易找到它们,这实际上并不存在于数据中。)满足条件时的子集值

Time Event Event 2 
0 Begin NA 
23 place run 
27 *Show Type* 
34 *place kick* 
41 good bye 
42 *place kick* 
0 Begin NA 
11 Hat  Yellow 
13 Show Green 
16 *place kick* 
20 place hit 
29 sign redeem 
35 *Show Type* 
0 Begin NA 
5 Cream Glue 
17 Show Green 
18 Orange Screen 
30 place hit 
33 sign redeem 
41 *Show Type* 
    0 Begin NA 
... 

编辑:到目前为止,有什么我可以做的,是子集,它具有显示类型或定位球用下面的代码行:

Rows <- Data[(Data[,'Event'] == 'Show' & Data[,'Event 2']== 'Type') | 
        (Data[,'Event'] == 'place' & Data[,'Event 2']== 'kick'),] 

当我挣扎,可以在Time重置为0后重置对这些值的搜索。任何帮助将不胜感激!

+0

和,你试过_what_到目前为止,这不是招”工作得很好?好像你只是要求某人为你编写解决方案。 – hrbrmstr

+0

据此编辑。谢谢! – useR

回答

3

& -infix函数可以用which函数包装以生成符合条件的行号的向量。然后按照[1]来获得第一个。

df[ which(df[ , 'Event'] %in% c('place','Show') & df[ ,'Event.2'] %in% c('kick','Type'))[1], ] 

请注意,我没有离开Event2之间的空间,因为这已经由R解析为两个不同的充符号。所有read.*函数都使用make.names函数从列名称中删除无效的标点符号。

为了使这个过程在每个新的段重置,你可能会建立一个段向量,可能类似于segvec= cumsum(df$Time==0),然后可能使用分裂应用组合方法来获取刚好在结果子集内的值。

一些轻微的测试代码:

lapply(split(dat, cumsum(dat[ ,'Time']==0)), 
     function(df){df[ which(df[ ,'Event'] %in% c('place','Show') & 
          df[ ,'Event.2'] %in% c('kick','Type'))[1], ]}) 
#------ 
$`1` 
    Time Event Event.2 
3 27 Show Type 

$`2` 
    Time Event Event.2 
10 16 place kick 

$`3` 
    Time Event Event.2 
20 41 Show Type 

dput(dat) 
structure(list(Time = c(0L, 23L, 27L, 34L, 41L, 42L, 0L, 11L, 
13L, 16L, 20L, 29L, 35L, 0L, 5L, 17L, 18L, 30L, 33L, 41L), Event = structure(c(1L, 
6L, 7L, 6L, 3L, 6L, 1L, 4L, 7L, 6L, 6L, 8L, 7L, 1L, 2L, 7L, 5L, 
6L, 8L, 7L), .Label = c("Begin", "Cream", "good", "Hat", "Orange", 
"place", "Show", "sign"), class = "factor"), Event.2 = structure(c(NA, 
7L, 9L, 5L, 1L, 5L, NA, 10L, 3L, 5L, 4L, 6L, 9L, NA, 2L, 3L, 
8L, 4L, 6L, 9L), .Label = c("bye", "Glue", "Green", "hit", "kick", 
"redeem", "run", "Screen", "Type", "Yellow"), class = "factor")), .Names = c("Time", 
"Event", "Event.2"), class = "data.frame", row.names = c(NA, 
-20L)) 
+0

所以我实际使用的数据集比我给你的示例数据集大得多。下面是尺寸: '暗淡(戏剧)'' [1] 196986 4' 'colnames(戏剧) [1] “时间” “说明” “资源”, “类型”'你给 代码我的: ''lapply(split(Plays,cumsum(Plays [Time] == 0)), function(df){df [which(df [Description]%in'23'& df [type]% [%] 145)[1],]}) – useR

+0

但是我得到这个错误: df [type]%in%: 维数不正确 另外:警告信息: 在分裂。默认(Plays,cumsum(Plays [Time] ==: 数据长度不是分割变量的倍数) 您有任何想法如何解决这个错误?我很困惑,因为'Plays'中的每个特定列都是相同尺寸 – useR

+0

'Plays [Time]'将成为一个列表,但'Plays [[Time]]'应该是一个向量,如果没有更好的实际数据描述,很难知道这是否是问题。问题包括'str(Plays)'的输出 –

0

远不如简洁(和prbly不太理想),比42年代,但:

library(stringi) 

read.table(text="Time Event Event2 
0 Begin NA 
23 place run) 
27 *Show Type* 
34 (*place kic)k* 
41 good bye 
42 (*place kic)k* 
0 Begin NA 
11 Hat  Yellow 
13 Show Green 
16 *place kick* 
20 place hit 
29 sign redeem 
35 *Show Type* 
0 Begin NA 
5 Cream Glue 
17 Show Green 
18 Orange Screen 
30 place hit 
33 sign redeem 
41 *Show Type* 
    0 Begin NA", header=TRUE, stringsAsFactors=FALSE) -> df 

library(dplyr) 

df$grp <- 0 
df[which(df$Time == 0),]$grp <- 1 
df$grp <- cumsum(df$grp) 

group_by(df, grp) %>% 
    filter(grepl("place|show", Event, ignore.case=TRUE) & grepl("kick|type", Event2, ignore.case=TRUE)) %>% 
    slice(1) %>% 
    select(-grp) 
## Source: local data frame [3 x 4] 
## Groups: grp [3] 
## 
##  grp Time Event Event2 
## <dbl> <int> <chr> <chr> 
## 1  1 27 *Show Type* 
## 2  2 16 *place kick* 
## 3  3 41 *Show Type*