我一整晚都在思考这个问题: 这是我的矩阵:
'a' '#' 3
'#' 'a' 3
0 'I am' 2
'I am' 0 2
我希望把第一行和第二行看作是相同的,因为它们只是'a'和'#'的顺序不同。在我的情况下,我想删除这种类型的行。这个示例很简单,前两行是相同的,第三行和第四行也是相同的。但在我的数据集中,我不知道哪一行是“相同”的。
我正在使用R编写。谢谢。
我一整晚都在思考这个问题: 这是我的矩阵:
'a' '#' 3
'#' 'a' 3
0 'I am' 2
'I am' 0 2
我希望把第一行和第二行看作是相同的,因为它们只是'a'和'#'的顺序不同。在我的情况下,我想删除这种类型的行。这个示例很简单,前两行是相同的,第三行和第四行也是相同的。但在我的数据集中,我不知道哪一行是“相同”的。
我正在使用R编写。谢谢。
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 中,以查找重复的项(行)。order(A)
将行进行排序,并返回带有列名的已排序行。然而,从lapply
得到的结果尊重列名,并将保留列名的版本传递给duplicated
。因此,duplicated
所考虑的内容与x相同!请参见我的答案以获取解决方案。 - agoldevorder(A)
将行整齐排序并返回具有已排序版本和列名的行,但从lapply得到的结果尊重列名,并将完整的列(因为名称)传递给duplicated()
。因此,duplicated()
所考虑的与x相同!duplicated(t(apply(x, 1, sort)))
这个方法也更加简短 ;)
请注意,@A Handcart And Mohair的示例仅适用于其样本数据。但如果您有命名列,则会失败。
示例1:
duplicated(iris)[140:143]
duplicated(iris3, MARGIN = c(1, 3))
例子3
anyDuplicated(iris)
示例 4
anyDuplicated(x)
例子 5
anyDuplicated(x, fromLast = TRUE)
编辑: 如果您想走一条冗长的路,可以考虑逐个字符地将每一行与数据中的每一行进行比较。为此,请想象第一行有3个字符。对于每一行,您循环遍历并检查它们是否具有此字符。如果是这样,然后您缩小并检查下一个字符。使用自创建的递归函数来处理这个问题,该函数将字符串中的值与数据框或矩阵中的所有其他行进行比较(然后仅对不匹配任何其他行的子集进行子集化),可能有效。
F T F T
还是T T T T
?(F
-不重复,T
-重复) - bartektartanusfor(i in 1:length(df[,1])){ x=(1:length(df[,1])) x=x[!x==i] for(n in x){ if(sort(df[i,])[1]==sort(df[n,])[1]&sort(df[i,])[2]==sort(df[n,])[2]&sort(df[i,])[3]==sort(df[n,])[3]){ df[n,1:3] <- NA } } }
- CCurtis