Dan*_*Dan 3 r duplicates dataframe
我有data.frame列表,需要应用非常具体的重复删除方法.我有理由对此data.frame列表使用特定的条件重复删除.但是,每个data.frame的重复删除条件是不同的.我想为第一个列表元素完成重复删除; 对于第二个列表元素,我需要搜索出现两次以上的行(freq> 2),并且只保留一行; 对于第三个列表元素,搜索出现三次以上的行(freq> 3),并在该data.frame中保留两行.我正在尝试为此数据操作任务获得更多编程,动态的解决方案.我尝试了我的镜头以获得很好的解决方案,但无法获得我想要的输出.我怎样才能轻松实现这一目标?任何方式更有效地完成此任务尊重我的具体输出?有什么好主意吗?
可重现的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))
)
Run Code Online (Sandbox Code Playgroud)
因为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))
)
Run Code Online (Sandbox Code Playgroud)
编辑:
在第二个data.frame中cat,我将查找出现三次的行,并将这些行只保留一次; 如果行出现两次,我不会对其进行重复删除.
对于第三个data.frame foo,我将检查出现三次以上的行,并保留两个相同的行.这就是我试图为每个data.frame进行非常具体的重复删除.我如何获得输出?
如何获得我想要的data.frame列表?我怎样才能轻松实现这一目标?非常感谢 !
我们可以根据使用vector()中指定的相应数字创建的逻辑索引Map来对list元素行进行子集化1:3.将data.frame元素转换list 为data.table(setDT(x)),按列分组('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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |