R将重复列标识为组

R将重复列标识为组,r,R,我有一个dataframe,但不知道如何根据重复列的值对它们进行分组。如何汇总这些数据,以便将重复列识别为3个不同的组,如下所示: A&C, B&D, E A=c(1,0,1) B=c(1,0,0) C=C(1,0,1) D=c(1,0,0) E=c(0,0,0) testframe=data.frame(A=A,B=B,C=C,D=D,E=E) dupsremoved使用t()两次并唯一() A=c(1,0,1) B=c(1,0,0) C=C(1,0,1) D=c(1,0,0) E=c(0,0

我有一个dataframe,但不知道如何根据重复列的值对它们进行分组。如何汇总这些数据,以便将重复列识别为3个不同的组,如下所示: A&C, B&D, E

A=c(1,0,1)
B=c(1,0,0)
C=C(1,0,1)
D=c(1,0,0)
E=c(0,0,0)
testframe=data.frame(A=A,B=B,C=C,D=D,E=E)
dupsremoved使用t()两次并唯一()

A=c(1,0,1)
B=c(1,0,0)
C=C(1,0,1)
D=c(1,0,0)
E=c(0,0,0)
testframe=data.frame(A=A,B=B,C=C,D=D,E=E)
测试框
#A、B、C、D、E
# 1 1 1 1 1 0
# 2 0 0 0 0 0
# 3 1 0 1 0 0
#转置

testframex从列中创建字符串(
sss
)并在此基础上进行比较的笨拙但有效的方法:

> library(dplyr)
> library(tibble)
> sss <- data.frame(apply(testframe,2,function(x) paste0(x,collapse=",")))
> names(sss) <- c("pattern")
> sss2 <- sss %>% rownames_to_column()
> lapply(unique(sss2$pattern), function(x) sss2$rowname[which(sss2$pattern==x)]) 
[[1]]
[1] "A" "C"

[[2]]
[1] "B" "D"

[[3]]
[1] "E"
>库(dplyr)
>图书馆(tibble)
>sss名称(sss)sss2%行名称到列()
>lappy(唯一(sss2$pattern),函数(x)sss2$rowname[其中(sss2$pattern==x)])
[[1]]
[1] “A”“C”
[[2]]
[1] B“D”
[[3]]
[1] “E”

您可以使用%
函数中的
%检查data.frame中是否存在具有相同值的列

df <- testframe # just to make a name shorter
df %in% df[1]   # df[1] is a data.frame with a single column (not a vector)

TRUE FALSE  TRUE FALSE FALSE
较大的数据集 由于性能原因,值得将列及其值编码为哈希,然后才进行比较。为方便起见,包装在函数中:

library(digest)

colTwins <- function(df) {
        hash.v <- vapply(df, function(x) digest(x), character(1))
        unique(lapply(seq(df), function(z) names(df)[hash.v %in% hash.v[z]]))
}

colTwins(df = df)

[1] "A" "C"

[[2]]
[1] "B" "D"

[[3]]
[1] "E"
库(摘要)

基于什么的复制?他们的
摘要
值?能否提供一个示例,说明您希望输出是什么样的?不确定如何定义副本,这会有所帮助。是的,基于副本的值。A和C都是1,0,1 B和D都是1,0,0问题是我仍然不知道A和C在同一组,B和D在同一组。谢谢你。
df <- testframe # just to make a name shorter
df %in% df[1]   # df[1] is a data.frame with a single column (not a vector)

TRUE FALSE  TRUE FALSE FALSE
unique(lapply(seq(df), function(x) names(df)[df %in% df[x]]))

[[1]]
[1] "A" "C"

[[2]]
[1] "B" "D"

[[3]]
[1] "E"
library(digest)

colTwins <- function(df) {
        hash.v <- vapply(df, function(x) digest(x), character(1))
        unique(lapply(seq(df), function(z) names(df)[hash.v %in% hash.v[z]]))
}

colTwins(df = df)

[1] "A" "C"

[[2]]
[1] "B" "D"

[[3]]
[1] "E"