R:如何解决无效的下标类型'list'

时间:2017-12-08 07:06:20

标签: r list sapply

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

我如何下标我的数据帧以获得所需的检查条件?

1 个答案:

答案 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。下一步可能是微不足道的。