Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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_Dataframe - Fatal编程技术网

R 列中值的重复组合

R 列中值的重复组合,r,dataframe,R,Dataframe,类似于,我有一个数据框,希望提取在几个特定列中的值组合中不唯一的行 例如,我有一个数据帧df: > df<-data.frame(c(1,2,3,4),c(T,F,T,T),c("a","b","c","b"),c("b","d","e","a")) > df [,1] [,2] [,3] [,4] [1,] "1" "TRUE" "a" "b" [2,] "2" "FALSE" "b" "d" [3,] "3" "TRUE" "c" "e"

类似于,我有一个数据框,希望提取在几个特定列中的值组合中不唯一的行

例如,我有一个数据帧df:

> df<-data.frame(c(1,2,3,4),c(T,F,T,T),c("a","b","c","b"),c("b","d","e","a"))
> df
     [,1] [,2]    [,3] [,4]
[1,] "1"  "TRUE"  "a"  "b" 
[2,] "2"  "FALSE" "b"  "d" 
[3,] "3"  "TRUE"  "c"  "e" 
[4,] "4"  "TRUE"  "b"  "a" 
>测向
[,1] [,2]    [,3] [,4]
[1,]1“真”a“b”
[2,]2“假”b“d”
[3,]3“真”c“e”
[4,]4“真”“b”“a”
我想测试列2、3和4中的值组合对于数据帧的行是唯一的还是重复的。但是,我不想将第一次出现的组合归类为唯一组合,将所有后续组合归类为重复组合,而是将所有出现的非唯一组合归类为重复组合

在本例中,第1行和第4行是重复的,第2行和第3行在第2、3和4列中的值组合是唯一的


任何帮助都将不胜感激。

我们使用
apply
MARGIN=1
按行对“df”中的3:4列进行排序,将其转置(
t
),并将输出分配给相应的列。为了获得所有重复项的逻辑索引,我们可以使用
fromLast=TRUE
在默认方向和反向应用
duplicated
。这里,我假设第一列不用于考虑重复元素

df[3:4] <- t(apply(df[3:4], 1, sort))
duplicated(df[-1])|duplicated(df[-1], fromLast=TRUE)
#[1]  TRUE FALSE FALSE  TRUE

df[3:4]使用dplyr的替代方法。它使用所有行的组合,并检查一行的所有元素是否属于另一行。最后,您得到的不是True/False,而是每一行的一个数字,表示它与其他行匹配的次数。如果您一步一步地运行脚本,这将更加明显

df<-data.frame(x1 =c(1,2,3,4),
               x2 = c(T,F,T,T),
               x3 = c("a","b","c","b"),
               x4 = c("b","d","e","a"), stringsAsFactors = F)

library(dplyr)


df %>%                                                                                
  rowwise() %>%                                                                     # for each row
  do(data.frame(., df2=df, stringsAsFactors=F)) %>%                                 # combine each row with all rows of dataset
  filter(x1 != df2.x1) %>%                                                          # exclude cases of self combinations
  rowwise() %>%                                                                     # for each row combination
  mutate(match = 
           ifelse(sum(c(x2,x3,x4) %in% c(df2.x2, df2.x3, df2.x4))==3, 1, 0)) %>%    # flag a match when all 3 elements of one row belong to the elements of the other row 
  group_by(x1,x2,x3,x4) %>%                                                         # group by rows of initial dataset
  summarise(sum_match = sum(match)) %>%                                             # calculate how many times they match with other rows
  ungroup


#   x1    x2 x3 x4 sum_match
# 1  1  TRUE  a  b         1
# 2  2 FALSE  b  d         0
# 3  3  TRUE  c  e         0
# 4  4  TRUE  b  a         1
df%
行方式()%>%#每行
do(data.frame(,df2=df,stringsAsFactors=F))%>%#将每一行与数据集的所有行合并
过滤器(x1!=df2.x1)%>%#排除自组合的情况
行方式()%>%#用于每个行组合
变异(匹配=
ifelse(求和(c(x2,x3,x4)%in%c(df2.x2,df2.x3,df2.x4))==3,1,0))%>%#当一行的所有3个元素都属于另一行的元素时,标记匹配
分组依据(x1,x2,x3,x4)%>%#分组依据初始数据集的行
汇总(sum_match=sum(match))%>%#计算它们与其他行匹配的次数
解组
#x1x2x3x4和匹配
#1真正的a b 1
#2 2假b d 0
#3真正的CE0
#4真正的b a 1

您的data.frame是一个矩阵。使用
data.frame
而不是
cbind
来创建data.frame。谢谢,它可以工作,尽管我不得不放弃重新指定第3列和第4列以保持数据框的当前形式。@在这种情况下,您可以创建一个新的数据框,然后执行重复的
dfN