我在R中有这样的文件。
**0 1**
0 2
**0 3**
0 4
0 5
0 6
0 7
0 8
0 9
0 10
**1 0**
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
**3 0**
正如我们所看到的,在此(标记对)中存在类似的无序对,例如,
1 0
和
0 1
我希望删除这些对。而且我想计算我拥有的这类对的数量,并将数量附加在重复的拖曳前面。如果不重复,则应在第三列中写入1。
例如(输出文件的样本)
0 1 2
0 2 1
0 3 2
0 4 1
0 5 1
0 6 1
0 7 1
0 8 1
0 9 1
0 10 1
1 11 1
1 12 1
1 13 1
1 14 1
1 15 1
1 16 1
1 17 1
1 18 1
1 19 1
如何在R中实现它?
答案 0 :(得分:4)
以下是使用transform
,pmin
和pmax
按行重新排序数据,然后使用aggregate
提供计数的方法:
# data
x <- data.frame(a=c(rep(0,10),rep(1,10),3),b=c(1:10,0,11:19,0))
#logic
aggregate(count~a+b,transform(x,a=pmin(a,b), b=pmax(a,b), count=1),sum)
a b count
1 0 1 2
2 0 2 1
3 0 3 2
4 0 4 1
5 0 5 1
6 0 6 1
7 0 7 1
8 0 8 1
9 0 9 1
10 0 10 1
11 1 11 1
12 1 12 1
13 1 13 1
14 1 14 1
15 1 15 1
16 1 16 1
17 1 17 1
18 1 18 1
19 1 19 1
答案 1 :(得分:2)
这是一种方法:
首先,创建一个已排序并粘贴在一起的列的矢量。
x <- apply(mydf, 1, function(x) paste(sort(x), collapse = " "))
然后,使用ave
创建您要查找的计数。
mydf$count <- ave(x, x, FUN = length)
最后,您可以再次使用“x”向量,这次是检测并删除重复的值。
mydf[!duplicated(x), ]
# V1 V2 count
# 1 0 1 2
# 2 0 2 1
# 3 0 3 2
# 4 0 4 1
# 5 0 5 1
# 6 0 6 1
# 7 0 7 1
# 8 0 8 1
# 9 0 9 1
# 10 0 10 1
# 12 1 11 1
# 13 1 12 1
# 14 1 13 1
# 15 1 14 1
# 16 1 15 1
# 17 1 16 1
# 18 1 17 1
# 19 1 18 1
# 20 1 19 1