我有一个包含12列和大量行的大型data.frame但是要简化
Id A1 A2 B1 B2 Result
1 55 23 62 12 1
2 23 55 12 62 1 * (dup of Id 1)
3 23 6 2 62 1
4 23 55 62 12 1 * (dup of Id 1)
5 21 62 55 23 0 * (dup of Id 1)
6 . . .
. .
. .
. .
现在A (A1, A2)
和B (B1, B2)
的排序无关紧要。如果它们都具有相同的值,例如(55,23)
和(62,12)
它们是重复的,无论A和B变量的排序如何。
此外,如果A_id_x = B_id_y
和B_id_x = A_id_y
以及Result_id_x = 1 - Result_id_y
我们也有重复。
如何清理这个重复框架?
答案 0 :(得分:4)
对于第一个我会创建一个新的变量做这样的事情:
tc= 'Id A1 A2 B1 B2 Result
1 55 23 62 12 1
2 23 55 12 62 1
3 23 6 2 62 1
4 23 55 62 12 1
5 21 62 55 23 0'
df =read.table(textConnection(tc),header=T)
df$tmp = paste(apply(df[,2:3],1,min),apply(df[,2:3],1,max),sep='')
subset(df, !duplicated(tmp))
对于第二部分,你的符号很混乱,但也许你可以遵循类似的程序。
答案 1 :(得分:1)
这个怎么样:
tc= 'Id A1 A2 B1 B2 Result
1 55 23 62 12 1
2 23 55 12 62 1
3 213 6 2 62 1
4 23 55 62 12 1
5 21 62 55 23 0'
x <- read.table(textConnection(tc),header=T)
a1b1 <- transform(x, combi="a1b1", a=A1, b=B1)
a1b2 <- transform(x, combi="a1b2", a=A1, b=B2)
a2b1 <- transform(x, combi="a2b1", a=A2, b=B1)
a2b2 <- transform(x, combi="a2b2", a=A2, b=B2)
x_long <- rbind(a1b1,a1b2,a2b1,a2b2)
idx <- duplicated(x_long[,c("a", "b")])
dup_ids <- unique(x_long[idx, "Id"])
unique_ids <- setdiff(x_long$Id, dup_ids)
x[unique_ids,]
关于Result
部分,我不清楚你的意思。
答案 2 :(得分:0)
查看allelematch
包。虽然此软件包主要用于查找由等位基因型数据组成的data.frame
中的匹配行,但它可以处理任何来源的数据。
当您处理需要超越duplicated()
提供的完美匹配功能的情况时,您可能会特别感兴趣。等位基因匹配处理丢失的数据和不匹配的数据(即两个行向量的所有元素不匹配或存在的情况)。它通过识别最相似的数据帧的行来返回候选匹配。
这可能比您需要的功能更多 - 听起来好像您的列已经以某种一致的方式进行了置换(这一点并不完全清楚您的帖子中的内容)。但是,如果确定一致的排列本身就是一个挑战,那么这种经验方法可能会有所帮助。
答案 3 :(得分:-1)
我最终使用Excel VBA编程来解决问题
这是程序:
为所有行内部排序每个A和每个B
然后翻转Result = 0的A和B的位置并将Result更改为1
删除重复项