簡體   English   中英

滿足條件時的子設定值

[英]Subsetting value when condition is met

我有一個數據框,其中包含發生隨機事件的時間。 我想要的是將事件“事件”下出現“位置”或“顯示”並結合事件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' ),]

我正在努力的地方是,在“時間”重置回0后能夠重置對這些值的搜索。我們將不勝感激!

& -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)來構建段向量,然后可能使用split-apply-combine方法來獲取結果中的值子集。

一些簡單的測試代碼:

 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))

遠不及42-s簡潔(而且最優性也較差),但是:

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*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM