![](/img/trans.png)
[英]R: subsetting data based on whether a condition is met by a specific number of columns
[英]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], ]
注意,我沒有在Event
和2
之間留一個空格,因為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.