-6ren">
gpt4 book ai didi

r - 从窄数据框快速生成列表

转载 作者:行者123 更新时间:2023-12-04 11:23:44 24 4
gpt4 key购买 nike

我有一个像这样的窄格式的 data.frame:

test_data<-data.frame(id=rep(1:200,50), 
variable=sample(LETTERS,10000,T),
value=sample(letters,10000,T), stringsAsFactors = F)

我想获得一个列表,其中包含每个 id 的列表,每个变量作为内部向量(类似于简单的 JSON 格式):

list("1"=list(A=c("a","b"), B=character(), C="v" ...

我的代码:

return_data <-
sapply(unique(test_data$id), function (r)
sapply(LETTERS, function(q)
test_data[test_data$id == r & test_data$variable == q, "value"],
USE.NAMES = T,simplify = F),
USE.NAMES = T,simplify = F)

它可以工作,但是对于大样本来说太慢了。我用数据重写了它。表,但它仍然很慢。我对 parSapply 有了一些改进,但我相信应该有更有效的算法......

最佳答案

由于 drop = FALSE 行为(默认情况下启用,但此处显式传递给可读性)。使用 magrittr:

library(magrittr)

res = test_data %>%
transform(variable = factor(variable)) %>%
split(.["id"]) %>%
lapply(function(x) split(x$value, x["variable"], drop = FALSE))

all.equal(unname(res), return_data) # TRUE

没有magrittr也一样:

new_test_data = transform(test_data, variable = factor(variable))
sp_id = split(new_test_data , new_test_data["id"])
res2 = lapply(sp_id, function(x) split(x$value, x["variable"], drop = FALSE))

all.equal(unname(res2), return_data) # TRUE

关于r - 从窄数据框快速生成列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com