R将重复列标识为组
我有一个dataframe,但不知道如何根据重复列的值对它们进行分组。如何汇总这些数据,以便将重复列识别为3个不同的组,如下所示: A&C, B&D, ER将重复列标识为组,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
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"