【问题标题】:R : How to resolve invalid subscript type 'list'R:如何解决无效的下标类型“列表”
【发布时间】:2018-05-22 09:41:43
【问题描述】:

原始数据框是

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

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

【问题讨论】:

  • 我不明白你为什么要拆分原始的data.frame。如果没有这一步,这样做会容易得多。请提供您的 data.frame 示例:stackoverflow.com/a/5963610/1412059
  • @Roland 已编辑。我这样做是因为我需要获取用户 ID 列表。

标签: r list sapply


【解决方案1】:

您的数据:

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

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2017-10-05
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多