唯一行,考虑两列,在 R 中,没有顺序
Unique rows, considering two columns, in R, without order
与我发现的问题不同,我想在没有顺序的情况下获得两列的唯一性。
我有一个 df:
df<-cbind(c("a","b","c","b"),c("b","d","e","a"))
> df
[,1] [,2]
[1,] "a" "b"
[2,] "b" "d"
[3,] "c" "e"
[4,] "b" "a"
在这种情况下,第 1 行和第 4 行是 "duplicates",因为 b-a 与 b-a 相同。
我知道如何找到第 1 列和第 2 列的唯一性,但我会发现在这种方法下每一行都是唯一的。
有很多方法可以做到这一点,这里是一个:
unique(t(apply(df, 1, sort)))
duplicated(t(apply(df, 1, sort)))
一个给出唯一行,另一个给出掩码。
如果所有元素都是字符串(哎呀,即使不是,你也可以强制转换它们),那么一个技巧是将其创建为 data.frame 并使用 dplyr
中的一些技巧就可以了。
library(dplyr)
df <- data.frame(v1 = c("a","b","c","b"), v2 = c("b","d","e","a"))
df$key <- apply(df, 1, function(s) paste0(sort(s), collapse=''))
head(df)
## v1 v2 key
## 1 a b ab
## 2 b d bd
## 3 c e ce
## 4 b a ab
$key
列现在应该会告诉您重复次数。
df %>% group_by(key) %>% do(head(., n = 1))
## Source: local data frame [3 x 3]
## Groups: key
## v1 v2 key
## 1 a b ab
## 2 b d bd
## 3 c e ce
如果只是两列,也可以用pmin
和pmax
,像这样:
library(data.table)
unique(as.data.table(df)[, c("V1", "V2") := list(pmin(V1, V2),
pmax(V1, V2))], by = c("V1", "V2"))
# V1 V2
# 1: a b
# 2: b d
# 3: c e
使用 "dplyr" 的类似方法可能是:
library(dplyr)
data.frame(df, stringsAsFactors = FALSE) %>%
mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>%
distinct(key)
# X1 X2 key
# 1 a b ab
# 2 b d bd
# 3 c e ce
您可以使用 igraph
创建无向图,然后转换回 data.frame
unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges"))
与我发现的问题不同,我想在没有顺序的情况下获得两列的唯一性。
我有一个 df:
df<-cbind(c("a","b","c","b"),c("b","d","e","a"))
> df
[,1] [,2]
[1,] "a" "b"
[2,] "b" "d"
[3,] "c" "e"
[4,] "b" "a"
在这种情况下,第 1 行和第 4 行是 "duplicates",因为 b-a 与 b-a 相同。
我知道如何找到第 1 列和第 2 列的唯一性,但我会发现在这种方法下每一行都是唯一的。
有很多方法可以做到这一点,这里是一个:
unique(t(apply(df, 1, sort)))
duplicated(t(apply(df, 1, sort)))
一个给出唯一行,另一个给出掩码。
如果所有元素都是字符串(哎呀,即使不是,你也可以强制转换它们),那么一个技巧是将其创建为 data.frame 并使用 dplyr
中的一些技巧就可以了。
library(dplyr)
df <- data.frame(v1 = c("a","b","c","b"), v2 = c("b","d","e","a"))
df$key <- apply(df, 1, function(s) paste0(sort(s), collapse=''))
head(df)
## v1 v2 key
## 1 a b ab
## 2 b d bd
## 3 c e ce
## 4 b a ab
$key
列现在应该会告诉您重复次数。
df %>% group_by(key) %>% do(head(., n = 1))
## Source: local data frame [3 x 3]
## Groups: key
## v1 v2 key
## 1 a b ab
## 2 b d bd
## 3 c e ce
如果只是两列,也可以用pmin
和pmax
,像这样:
library(data.table)
unique(as.data.table(df)[, c("V1", "V2") := list(pmin(V1, V2),
pmax(V1, V2))], by = c("V1", "V2"))
# V1 V2
# 1: a b
# 2: b d
# 3: c e
使用 "dplyr" 的类似方法可能是:
library(dplyr)
data.frame(df, stringsAsFactors = FALSE) %>%
mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>%
distinct(key)
# X1 X2 key
# 1 a b ab
# 2 b d bd
# 3 c e ce
您可以使用 igraph
创建无向图,然后转换回 data.frame
unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges"))