在数据框中查找唯一的行组
Finding unique group of rows in a data frame
我有一个数据框,我想在其中比较一组行,并且仅当整个组相同时才删除。例如:
df<-data.frame(X=c("a", "a", "a", "b", "b", "b", "c", "c", "c"), Y=c(1,2,1,2,2,2,1,2,1), Z=c("ABC","DEF","ABC", "DEF", "DEF", "DEF", "ABC", "DEF", "ABC"))
X Y Z
1 a 1 ABC
2 a 2 DEF
3 a 1 ABC
4 b 2 DEF
5 b 2 DEF
6 b 2 DEF
7 c 1 ABC
8 c 2 DEF
9 c 1 ABC
此处的组由 X 列标识,我想在不同组之间进行比较。所以,这里的a组和c组是相同的。我想得到最终想要的结果如下:
GroupID Y Z
1 1 1 ABC
2 1 2 DEF
3 1 1 ABC
4 2 2 DEF
5 2 2 DEF
6 2 2 DEF
知道如何进行这种比较吗?
您可能需要查看 "compare" 包中的 compare
函数。这是一种可能性:
library(compare)
x <- with(df, split(df[-1], df[[1]]))
Splits <- combn(names(x), 2)
Comparison <- apply(Splits, 2, function(y) {
compare(x[y[1]], x[y[2]], allowAll = TRUE)$result
})
Splits[, Comparison]
# [1] "a" "c"
从这里我们可以看出组 "a" 和 "c" 是重复的,我们可以使用它来对原始数据集进行子集化。
我在此答案中使用了 allowAll = TRUE
,但您可能希望查看 compare
中可用的其他选项,以确定您实际希望在比较中允许哪些转换。
A base
R 可能性:
# For each 'X', collapse 'Y' and 'Z' to a vector
l <- by(df[ , c("Y", "Z")], df$X, function(dat) paste0(dat, collapse = ""))
# select names of unique list elements
nm <- names(l)[!duplicated(l)]
# use these names to subset the data frame
df[df$X %in% nm, ]
# X Y Z
# 1 a 1 ABC
# 2 a 2 DEF
# 3 a 1 ABC
# 4 b 2 DEF
# 5 b 2 DEF
# 6 b 2 DEF
我有一个数据框,我想在其中比较一组行,并且仅当整个组相同时才删除。例如:
df<-data.frame(X=c("a", "a", "a", "b", "b", "b", "c", "c", "c"), Y=c(1,2,1,2,2,2,1,2,1), Z=c("ABC","DEF","ABC", "DEF", "DEF", "DEF", "ABC", "DEF", "ABC"))
X Y Z
1 a 1 ABC
2 a 2 DEF
3 a 1 ABC
4 b 2 DEF
5 b 2 DEF
6 b 2 DEF
7 c 1 ABC
8 c 2 DEF
9 c 1 ABC
此处的组由 X 列标识,我想在不同组之间进行比较。所以,这里的a组和c组是相同的。我想得到最终想要的结果如下:
GroupID Y Z
1 1 1 ABC
2 1 2 DEF
3 1 1 ABC
4 2 2 DEF
5 2 2 DEF
6 2 2 DEF
知道如何进行这种比较吗?
您可能需要查看 "compare" 包中的 compare
函数。这是一种可能性:
library(compare)
x <- with(df, split(df[-1], df[[1]]))
Splits <- combn(names(x), 2)
Comparison <- apply(Splits, 2, function(y) {
compare(x[y[1]], x[y[2]], allowAll = TRUE)$result
})
Splits[, Comparison]
# [1] "a" "c"
从这里我们可以看出组 "a" 和 "c" 是重复的,我们可以使用它来对原始数据集进行子集化。
我在此答案中使用了 allowAll = TRUE
,但您可能希望查看 compare
中可用的其他选项,以确定您实际希望在比较中允许哪些转换。
A base
R 可能性:
# For each 'X', collapse 'Y' and 'Z' to a vector
l <- by(df[ , c("Y", "Z")], df$X, function(dat) paste0(dat, collapse = ""))
# select names of unique list elements
nm <- names(l)[!duplicated(l)]
# use these names to subset the data frame
df[df$X %in% nm, ]
# X Y Z
# 1 a 1 ABC
# 2 a 2 DEF
# 3 a 1 ABC
# 4 b 2 DEF
# 5 b 2 DEF
# 6 b 2 DEF