2013-08-30 53 views
2

我R中有一個數據幀,看起來像這樣:在數據幀列子集列表與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在每個列表元素然後拉出元素後面的數字。

問題是,我甚至無法計算出如何將數據框列的子集拉出列表的一個元素,更不用說排列Trues和False!

任何想法?

+0

您可能想考慮重組y我們的data.frame避免有一列列表。 – Frank

+0

你是否保證只有一個「分鐘播放」按行,後面是數字?如果不是,你想要做什麼? – flodel

回答

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,以確定 「出場」 的字符串。這將返回數字位置。您想要在此之後的值,所以我們在grep的輸出中加1以獲得您要查找的數字。

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" 
+0

@ flodel,你能否詳細說明你的評論? – A5C1D2H2I1M1N2O1R2T1

+0

爲什麼我比較喜歡'匹配'到'grep'? a)它會更好地處理沒有匹配的可能性,因爲匹配仍然返回長度爲1的矢量,這裏是「NA」。 b)它將完全匹配字符串。 c)我認爲它會更快(我猜''=='比'grep'快,也認爲'匹配'只要找到一個匹配就會停止。) – flodel

+0

@ flodel,感謝您的解釋。 – A5C1D2H2I1M1N2O1R2T1

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]) 
    } 
} 
相關問題