Origianl数据框是
id status name ...
1 0 V
1 0 S
1 1 V
1 0 V
2 0 V
2 1 V
2 1 S
3 0 V
3 1 S
4 1 S
4 0 V
4 1 V
除此之外,我希望获取id 2和3,因为在他们的子集中我有一个“0-V”组合,后跟“1-S”
我已将其拆分为数据帧列表,我想获取这些数据帧上某些特定条件的ID,但我收到错误
invalid subscript type 'list'
结构如下
"1"
id status name ...
1 0 V
1 0 S
1 1 V
1 0 V
"2"
id status name ...
2 0 V
2 1 V
2 1 S
...
现在我需要找到一个条件,以便我得到一个id为0状态的记录,名称为'V'后跟1状态,名称为“S”,如id 2。
为此,我正在尝试为sapply编写一个函数,但我无法下标数据,因为我假设它是
这是代码
q4 <- result1[,c("id", "name", "date", "status")]
lstQ <- split(q4, result1$id)
f3 <- function(g) {
g[g$status == 0 & g$name == "V",]
}
e <- as.data.frame(names(lstQ)[sapply(lstQ, f3)])
我如何下标我的数据帧以获得所需的检查条件?
答案 0 :(得分:0)
您的数据:
DF <- read.table(text = "id status name
1 0 V
1 0 S
1 1 V
1 0 V
2 0 V
2 1 V
2 1 S
3 0 V
3 1 S
4 1 S
4 0 V
4 1 V", header = TRUE)
让我们写一个函数:
fun <- function(DF) {
one <- DF$status == 0 & DF$name == "V"
two <- DF$status == 1 & DF$name == "S"
#Is two TRUE after one is TRUE?
if (any(one) && any(two)) return(any(which(two) > which.max(one)))
return(FALSE)
}
使用“分组依据”类型功能。我喜欢data.table,其他人更喜欢dplyr:
library(data.table)
setDT(DF)
DF[, fun(.SD), by = id]
# id V1
#1: 1 FALSE
#2: 2 TRUE
#3: 3 TRUE
#4: 4 FALSE
如果您愿意或继续使用data.table及其语法,则可以使用setDF
。下一步可能是微不足道的。