我得到了一个嵌套列表,其中每个子列表都包含有关一个特定数据框架的值的信息。该清单的结构如下:
summary <- list(df1 = list(value1 = "phone", count = 11, ratio = 78.57, value2 = "mail", count = 13, ratio = 92.86, value3 = "zoom", count = 8, ratio = 57.14),
df2 = list(value4 = "yes", count = 4, ratio = 28.57, value5 = "no", count = 10, ratio = 71.43))
str(summary)
List of 2
$ df1:List of 9
..$ value1: chr "phone"
..$ count : num 11
..$ ratio : num 78.6
..$ value2: chr "mail"
..$ count : num 13
..$ ratio : num 92.9
..$ value3: chr "zoom"
..$ count : num 8
..$ ratio : num 57.1
$ df2:List of 6
..$ value4: chr "yes"
..$ count : num 4
..$ ratio : num 28.6
..$ value5: chr "no"
..$ count : num 10
..$ ratio : num 71.4在这里,summary[[1]]指出,在数据帧1中,值“phone”以一定的比例发生了11次,值“mail”发生了13次,等等。同样的情况也适用于数据框架2,其中“是”被计算了四次等等。
现在,我想要创建一个嵌套列表,它总结了每个子列表的值、计数和比率。更准确地说,结果列表的每个子列表应该只包含三个元素值,计数和比率,每个元素包含值、相应的计数和比率。所需的列表结果应该具有以下结构:
result <- list(res_df1 = list(value = c("phone", "mail", "zoom"), count = c(11,13,8), ratio = c(78.57, 92.86, 57.14)),
res_df2 = list(value = c("yes", "no"), count = c(4, 10), ratio = c(28.57, 71.43)))
str(result)
List of 2
$ res_df1:List of 3
..$ value: chr [1:3] "phone" "mail" "zoom"
..$ count: num [1:3] 11 13 8
..$ ratio: num [1:3] 78.6 92.9 57.1
$ res_df2:List of 3
..$ value: chr [1:2] "yes" "no"
..$ count: num [1:2] 4 10
..$ ratio: num [1:2] 28.6 71.4我想出了一个解决方案,它产生了这样的结果,但它更像是一个解决方案,而不是一个很好的R解决方案:
library(rlist)
result <- list()
for(i in 1:length(summary)){
tmp <- (summary[[i]])
value <- as.character(tmp[seq(1, length(tmp), 3)])
count <- as.numeric(tmp[seq(2, length(tmp), 3)])
ratio <- as.numeric(tmp[seq(3, length(tmp), 3)])
df <- cbind.data.frame(value, count, ratio)
result <- list.append(result, df)
}我无法想出一个工作解决方案,例如,包含lapply方法或类似的方法。有没有一种更好、更紧凑的方法来做到这一点?如有任何建议,敬请谅解!
发布于 2021-03-11 16:30:02
你试过这样的东西吗?
for (i in 1:3) {
idx <- seq(i, length(summary[[1]]), 3)
assign(paste0("new",i), lapply(summary[[1]][idx], "[[", 1) )
}
data.table::rbindlist(list(new1, new2, new3))如果您对每个子列表都这样做(也许用max_length而不是3来交换索引i),这是一种更R的方法。我们使用lapply,[,最后使用来自data.table package的非常快的data.table package(我把它放在那里只是为了突出显示它来自这个包)
这给了你:
value1 value2 value3
1: phone mail zoom
2: 11 13 8
3: 78.57 92.86 57.14正如您在本文中看到的那样,这种rbindlist方法也具有很强的可伸缩性:
因为它可以比追加或重新绑定更快地绑定许多文件/列表。
https://stackoverflow.com/questions/66586021
复制相似问题