我一直在想这个问题一整晚: 这是我的矩阵:
'a' '#' 3
'#' 'a' 3
0 'I am' 2
'I am' 0 2
.....
我想把前两行的行视为相同,因为它只是'a'和'#'的不同顺序。就我而言,我想删除这种行。 玩具示例很简单,前两个是相同的,第三个和第四个是相同的。但在我的数据集中,我不知道“同一行”在哪里。
我正在写R.谢谢。
答案 0 :(得分:3)
也许这样的事情对你有用。目前尚不清楚你想要的输出是什么。
x <- structure(c("a", "#", "0", "I am", "#", "a", "I am", "0", "3",
"3", "2", "2"), .Dim = c(4L, 3L))
x
# [,1] [,2] [,3]
# [1,] "a" "#" "3"
# [2,] "#" "a" "3"
# [3,] "0" "I am" "2"
# [4,] "I am" "0" "2"
duplicated(
lapply(1:nrow(x), function(y){
A <- x[y, ]
A[order(A)]
}))
# [1] FALSE TRUE FALSE TRUE
这基本上按行拆分矩阵,然后对每一行进行排序。 duplicated
也可以在list
上运行,所以你只需用`duplicated'来整理整个东西,找出哪些项(行)是重复的。
答案 1 :(得分:3)
对我来说,这也产生了一个FALSE向量,这意味着它没有检测到重复。我想这就是发生的事情:我在x中分配了列名。因此,虽然order(A)
整齐排序行并返回带有列名的行的有序版本,但lapply生成的对象会尊重列名并将{0}}移交给列完整的版本(因为名字)。因此,duplicated()
所考虑的与x相同!
我的灵感来自为我工作的@A Handcart And Mohair的答案:
duplicated()
它也更短;)
请注意,@ A Handcart And Mohair的示例使用他的示例数据。但如果您已命名列,则会失败。
答案 2 :(得分:1)
首先,您可以参考to the documentation for an excellent R package called duplicated。正如包注释,&#34; duplicated()确定向量或数据帧的哪些元素是具有较小下标的元素的副本,并返回指示哪些元素(行)是重复的逻辑向量。&#34;他们提供的一些例子是:
示例1:
duplicated(iris)[140:143]
示例2:
duplicated(iris3, MARGIN = c(1, 3))
<强>示例3 强>
anyDuplicated(iris)
示例4
anyDuplicated(x)
示例5
anyDuplicated(x, fromLast = TRUE)
编辑:如果您想要做很多事情,您可能会考虑逐个字符地比较数据中的每一行到每一行。为此,假设第一行有3个字符。对于每一行,您循环并检查它们是否具有此字符。如果他们这样做,那么你减少并检查下一个字符。使用自己创建的递归函数来处理这个问题,该函数将字符串中的值与数据框或矩阵中的所有其他行(以及仅与任何其他行不匹配的行上的子集)进行比较,可以正常工作。