使用列表列表的最有效方法是什么?

时间:2017-07-14 19:55:03

标签: arrays r dataframe

有一个数据框(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))

1 个答案:

答案 0 :(得分: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)。)