2

我在 R 中有一个如下所示的数据框:

    id  event_explain
1   80  list("Minutes played", 0, 0)
2   81  list("Minutes played", 0, 0)
3   82  list("Bonus", 2, 2, "Clean sheets", 1, 4, "Minutes played", 90, 2)

我试图在“播放分钟数”之后提取数字,所以在这个例子中,我最终会得到 0,0,90 之类的东西。

我创建了某种索引列表来识别元素“播放分钟数”

    list(c(TRUE, FALSE, FALSE), c(TRUE, FALSE, FALSE), c(FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)

并在想也许我可以(以某种方式)置换每个列表元素中的 T/F,然后提取元素后面的数字。

问题是,我什至无法弄清楚如何对数据框列进行子集化以提取列表的元素,更不用说置换真假了!

有任何想法吗?

4

2 回答 2

3

这是一个解决方案。

首先,一些示例数据:

mydf <- data.frame(
  id = c(80, 81, 82), event = I(
    list(list("Minutes played", 0, 0),
         list("Minutes played", 0, 0), 
         list("Bonus", 2, 2, "Clean sheets", 1, 4, "Minutes played", 90, 2))))

用于grep标识字符串“播放的分钟数”。这将返回数字位置。您需要紧随其后的值,因此我们将 1 添加到 的输出grep以获取您要查找的数字。

unlist(sapply(mydf$event, function(x) x[grep("Minutes played", x)+1]))
# [1]  0  0 90

或者,或者,使用match

unlist(sapply(mydf$event, function(x) x[match("Minutes played", x)+1]))
# [1]  0  0 90

或者,由于您说您已经创建了一个索引列表,您可以使用以下内容:

## Your index list
Index <- list(c(TRUE, FALSE, FALSE), 
              c(TRUE, FALSE, FALSE), 
              c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE))

## Extracting what you want
unlist(mydf$event)[which(unlist(Index))+1]
# [1] "0"  "0"  "90"
于 2013-08-30T16:28:06.587 回答
0
## borrow the man above's data
mydf <- data.frame(
  id = c(80, 81, 82), event = I(
    list(list("Minutes played", 0, 0),
         list("Minutes played", 0, 0), 
         list("Bonus", 2, 2, "Clean sheets", 1, 4, "Minutes played", 90, 2))))
result<-c()
for (i in 1:3) {
    if("Minutes played" %in% mydf$event[[i]]) {
        result<-c(result,mydf$event[[i]][which("Minutes played" == mydf$event[[i]])+1] )
    }
}
于 2013-08-30T16:54:35.833 回答