Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
唯一行,考虑两列,在R中,无顺序_R_Unique_Plyr_Dplyr - Fatal编程技术网

唯一行,考虑两列,在R中,无顺序

唯一行,考虑两列,在R中,无顺序,r,unique,plyr,dplyr,R,Unique,Plyr,Dplyr,与我发现的问题不同,我想得到两列中唯一的一列,没有顺序 我有一个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" df [,1] [,2] [1,]a“b” [2,]b“d” [3,][c”“e” [4,]b“a” 在这种情况下,第1行和第4行是“重复的”,即

与我发现的问题不同,我想得到两列中唯一的一列,没有顺序

我有一个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" 
df
[,1] [,2]
[1,]a“b”
[2,]b“d”
[3,][c”“e”
[4,]b“a”
在这种情况下,第1行和第4行是“重复的”,即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

如果只有两列,还可以使用
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,
unique(df)
就可以了。尝试
dfI不这么认为,
unique(df)
不会跨列检查
c('a','b')
是否与
c('b','a')有效相同(为什么要这样做?)。稍微多做一些工作…这不是很好地使用
dplyr
。如果你想走这条路,我建议你看看
distinct
。在一个小的(100k行)数据集上,这种方法目前在我的系统上需要>4秒,而基本R方法需要~1.3秒,data.table方法需要~0.03秒。使用
pmin
pmax
就是速度的来源。my
数据的
dplyr
变体。表
答案以约0.05秒的速度运行。作为参考,我所指的变体如下:
data.frame(df,stringsAsFactors=FALSE)%%>%mutate(key=paste0(pmin(X1,X2),pmax(X1,X2),sep=“”)%%>%distinct(key)
您的代码确实令人印象深刻。我仍在学习
dplyr
的细节,这对您来说一定是显而易见的。这种方法返回行的第一次唯一出现(行1,2,3),但不会返回原始海报定义的重复行(行1,4)/唯一行(2,3)。为什么需要
by=c(“V1”,“V2”)
?似乎省略它会得到相同的结果。
unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges"))