R 列中值的重复组合
类似于,我有一个数据框,希望提取在几个特定列中的值组合中不唯一的行 例如,我有一个数据帧df: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<-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