在R中根据数据框匹配列的长度重复列表
解决列表按数据框同名行重复的问题
问题重现
给定列表和数据框:
mylist <- list(A = c(1,2,5,6), B = c(2,4,6,5), C = c(2,4,2,35)) mydf <- as.data.frame(c("A", "A", "A", "B", "B", "C")) colnames(mydf) <- "Freq"
需要得到与mydf行数一致的列表,其中A重复3次、B重复2次、C重复1次。
可行实现方法
方法1:按数据框每行名称直接提取对应列表元素
通过lapply遍历mydf$Freq的每个元素,提取mylist中对应名称的子列表:
result <- lapply(mydf$Freq, function(x) mylist[[x]]) # 可选:给结果命名,保持和原列表一致的命名逻辑 names(result) <- mydf$Freq
输出结果:
$A [1] 1 2 5 6 $A [1] 1 2 5 6 $A [1] 1 2 5 6 $B [1] 2 4 6 5 $B [1] 2 4 6 5 $C [1] 2 4 2 35
方法2:先统计频数再重复列表元素
先统计每个名称的出现次数,再用rep函数按次数重复列表项:
# 统计各名称的出现次数 freq_table <- table(mydf$Freq) # 按次数重复列表元素 result <- rep(mylist, times = freq_table)
该方法的结果顺序与mydf行顺序一致,因为table会按名称排序,且mylist的名称顺序与mydf中出现的名称顺序匹配。
之前尝试的错误分析
你之前的代码中使用mylist[[]]是提取列表的第一个元素(即A对应的向量),而非按名称匹配整个列表的元素,导致rep函数无法正确识别需要重复的列表项,最终得到不符合预期的结果。
内容的提问来源于stack exchange,提问作者simpson
相关产品推荐
相关产品推荐

