gpt4 book ai didi

r - 如何对 data.frame 列表应用条件重复删除?

转载 作者:行者123 更新时间:2023-12-04 11:50:58 25 4
gpt4 key购买 nike

我有需要应用非常具体的重复删除方法的 data.frame 列表。我有理由为此 data.frame 列表使用特定的条件重复删除。但是,每个单独的 data.frame 的重复删除条件是不同的。我想为第一个列表元素完全删除重复项;对于第二个列表元素,我需要搜索出现两次以上的行(频率> 2),并且只保留一行;对于第三个列表元素,搜索出现次数超过三次 (freq>3) 的行,并在该 data.frame 中保留两行。我正试图为这个数据操作任务获得更多的程序化、动态的解决方案。我尝试了我的镜头以获得很好的解决方案,但无法获得我想要的输出。我怎样才能让这件事轻松发生?有什么方法可以根据我的特定输出更有效地完成此任务?有什么想法吗?

可重现的数据框架:

myList <- list(
bar= data.frame(start.pos=c(9,19,34,54,70,82,136,9,34,70,136,9,82,136),
end.pos=c(14,21,39,61,73,87,153,14,39,73,153,14,87,153),
pos.score=c(48,6,9,8,4,15,38,48,9,4,38,48,15,38)),
cat = data.frame(start.pos=c(7,21,21,72,142,7,16,21,45,72,100,114,142,16,72,114),
end.pos=c(10,34,34,78,147,10,17,34,51,78,103,124,147,17,78,124),
pos.score=c(53,14,14,20,4,53,20,14,11,20,7,32,4,20,20,32)),
foo= data.frame(start.pos=c(12,12,12,58,58,58,118,12,12,44,58,102,118,12,58,118),
end.pos=c(36,36,36,92,92,92,139,36,36,49,92,109,139,36,92,139),
pos.score=c(48,48,48,12,12,12,5,48,48,12,12,11,5,48,12,5))
)

因为 myList 是自定义函数的结果,所以不能分离 data.frame。我正在寻找更多的程序化解决方案来为我的数据进行这种特定的重复删除。如果输入是 data.frame 列表,我该如何进行特定的重复删除?

我想要的输出如下:

expectedList <- list(
bar= data.frame(start.pos=c(9,19,34,54,70,82,136),
end.pos=c(14,21,39,61,73,87,153),
pos.score=c(48,6,9,8,4,15,38)),
cat= data.frame(start.pos=c(7,21,72,142,7,16,45,100,114,142,16,114),
end.pos=c(10,34,78,147,10,17,51,103,124,147,17,124),
pos.score=c(53,14,20,4,53,20,11,7,32,4,20,32)),
foo= data.frame(start.pos=c(12,12,44,58,58,118,102,118,118),
end.pos=c(36,36,49,92,92,139,109,139,139),
pos.score=c(48,48,12,12,12,5,11,5,5))
)

编辑:

在第二个 data.frame cat 中,我将查找出现三次的行,并只保留这些行一次;如果行出现两次,我不会对其进行重复删除。

对于第三个 data.frame foo,我将检查出现次数超过三次的行,并保留两个相同的行。这就是我试图为每个 data.frame 进行非常具体的重复删除。我怎样才能得到我的输出?

如何获得我想要的 data.frame 列表?我怎样才能让这件事轻松发生?非常感谢!

最佳答案

我们可以执行此 Map,根据使用向量中指定的相应数字创建的逻辑索引对 list 元素的行进行子集化 (1: 3)。将 list 中的 data.frame 元素转换为 data.table (setDT(x)) ,按columns ('start.pos', 'end.pos', 'pos.score'),我们得到行数(.N),用if/else创建一个逻辑索引 并获取满足 OP 帖子中指定条件的行序列,使用 .I 获取行索引,提取该索引列($V1 ) 并使用它来对数据集进行子集化。

library(data.table)
res <- Map(function(x,y) setDT(x)[x[, .I[if(.N > y) seq_len(pmax(y-1, 1))
else seq_len(.N)] , .(start.pos, end.pos, pos.score)]$V1], myList, 1:3)
sapply(res, nrow)
#bar cat foo
# 7 12 9

sapply(expectedList, nrow)
#bar cat foo
#7 12 9

关于r - 如何对 data.frame 列表应用条件重复删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367277/

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