我有一个矩阵,其中包含以下两种形式的列:
AAA 1/1/0
AAA 1/0/1
BBB 1/1/0
BBB 1/1/0
BBB 1/1/0
BBB 1/1/0
CCC 1/1/0
CCC 1/0/1
CCC 1/1/0
CCC 1/0/1
我想获得以下矩阵,在第一列中使用相同的值进行过滤,在第二列中没有相同的值:
AAA 1/1/0
AAA 1/0/1
CCC 1/1/0
CCC 1/0/1
任何帮助将不胜感激!!!
塔拉
答案 0 :(得分:1)
使用@wleoncio的数据和建议:
data <- data.frame(x1 = c(rep('AAA', 2), rep('BBB', 4), rep('CCC', 4)), x2 = c('1/1/0', '1/0/1', rep('1/1/0', 5), '1/0/1', '1/1/0', '1/0/1'))
library(data.table)
dt = data.table(data)
# setkey, to make sure we only do the unique on the first two columns
setkey(dt, x1, x2)
# unique almost gets us there, we just need to also filter out the loners
unique(dt)[, .SD[.N > 1], by = x1]
# x1 x2
#1: AAA 1/1/0
#2: AAA 1/0/1
#3: CCC 1/1/0
#4: CCC 1/0/1
答案 1 :(得分:1)
对我来说,看起来你想保留:
这会排除BBB
行,因为第二列中的值都相同。如果是这种情况,那么您可以使用duplicated
,但您还需要进行一些进一步的子集化以删除这些行(感谢 @wleoncio 获取数据):
data <- data.frame(x1 = c(rep('AAA', 2), rep('BBB', 4), rep('CCC', 4)), x2 = c('1/1/0', '1/0/1', rep('1/1/0', 5), '1/0/1', '1/1/0', '1/0/1'))
newdat <- data[ ! duplicated(data) , ]
x1 x2
1 AAA 1/1/0
2 AAA 1/0/1
3 BBB 1/1/0
7 CCC 1/1/0
8 CCC 1/0/1
keep <- unclass( table(newdat$x1) ) != 1
AAA BBB CCC
TRUE FALSE TRUE
newdat[ newdat$x1 %in% unique(newdat$x1 )[keep] , ]
x1 x2
1 AAA 1/1/0
2 AAA 1/0/1
7 CCC 1/1/0
8 CCC 1/0/1