2017-07-14 90 views
0

具有數據幀(df),其中列(df$list)之一的成分列表不同長度的,什麼是應用在此列的函數,並將結果保存在新列的最佳方式?使用列表清單的最有效方法是什麼?

下面是什麼我都試過了,但它是我的數據幀極其緩慢(10K行,沒有太大)。我正在尋找其他更好的方法來完成這項任務。

df$new <- apply(df, 1, FUN = function(x) myFunc(x$list)) 

實施例:

# constructing df & DF 
a <- c(rep("A", 3), rep("B", 3), rep("A",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <- data.frame(a,b) 

DF <- data.frame(c = c(1:8), d = c(8:1)) 
row.names(DF) <- c("A", "B", "C", "D", "E", "F", "G", "H") 

# list of lists 
df_red <- aggregate(list(track = 1:NROW(df)), df[,1:2], '[') 
df_red$list_1 <- apply(df_red, 1, FUN = function(x) row.names(DF[(x$track),])) 

# Function 
searchInDF <- function(list){DF[list,]$d} 

# apply function on a list of list 
df_red$list_2 <- apply(df_red, 1, FUN = function(x) searchInDF(x$list_1)) 
+4

請提供reproducibl例如。 –

+0

可能最適合創建/更改爲不同的數據結構。列表列很少是一個好主意。 – Roland

+0

請參閱更新 – Rotail

回答

3

在這裏,我們創建這樣的數據幀DF,然後找到b列的每個部件的長度。這假定sapply返回一個簡單的向量。

DF <- data.frame(a = 1:2) 
DF$b <- list(list("a", "b"), list("c", "d", "e")) 

DF$c <- sapply(DF$b, length) 

,或者如果新列本身就是一個列表:

DF$c <- lapply(DF$b, rev) 

也可以嘗試這些替代方案:

replace(DF, "c", sapply(DF$b, length)) 
replace(DF, "c", list(lapply(DF$b, rev))) 

transform(DF, c = sapply(b, length)) 

(當然,在length特定情況下,我們可能已經取代sapply(...)只有lengths(DF$b)

+0

在上面的例子中,我應該期望'transform(df_red,c = sapply(list_1,searchInDF))'工作嗎? – Rotail

+1

修改了答案以解決新列是列表的情況。 –

+0

謝謝。它們都運行良好,但是在問題中提到的「應用」就如同緩慢。不知道是什麼原因造成的。我必須對輸入/輸出進行更多的調查。或者,也許我定義myFunction的方式導致它... – Rotail

相關問題