2017-01-10 124 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*