簡體   English   中英

使用列表列表的最有效方法?

[英]The most efficient way to work with list of lists?

如果有一個數據幀( df ),其中一列( df$list )的組成部分是具有不同長度的列表,那么在此列上應用函數並將結果保存到新列中的最佳方法是什么?

以下是我嘗試過的操作,但是對於我的數據幀(萬行,不要太大),它的速度非常慢。 我正在尋找更好的替代方法來完成此任務。

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

在這里,我們創建了這樣的數據幀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)替換sapply(...) lengths(DF$b) 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM