R 合并重复的列名
我有一个数据框,其中一些列具有相同的数据,但列名不同。我想删除重复的列,但合并列名。例如,test1和test4列是重复的:R 合并重复的列名,r,R,我有一个数据框,其中一些列具有相同的数据,但列名不同。我想删除重复的列,但合并列名。例如,test1和test4列是重复的: df test1 test2 test3 test4 1 1 1 0 1 2 2 2 2 2 3 3 4 4 3 4 4 4 4 4 5 5 5 5 5
df
test1 test2 test3 test4
1 1 1 0 1
2 2 2 2 2
3 3 4 4 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
我希望结果是这样的:
df
test1+test4 test2 test3
1 1 1 0
2 2 2 2
3 3 4 4
4 4 4 4
5 5 5 5
6 6 6 6
以下是数据:
structure(list(test1 = c(1, 2, 3, 4, 5, 6), test2 = c(1, 2, 4,
4, 5, 6), test3 = c(0, 2, 4, 4, 5, 6), test4 = c(1, 2, 3, 4,
5, 6)), .Names = c("test1", "test2", "test3", "test4"), row.names = c(NA,
-6L), class = "data.frame")
请注意,我并不只是想删除重复的列。我还想在删除重复列后合并重复列的列名
我可以为我发布的简单表手动执行此操作,但我想在大型数据集上使用此操作,因为我事先不知道哪些列是相同的。我不知道如何手动删除和重命名列,因为我可能有50多个重复的列。这不是完全自动的,但循环的输出将识别成对的重复列。然后必须删除其中一个重复列,然后根据重复的列重新命名
df <- structure(list(test1 = c(1, 2, 3, 4, 5, 6), test2 = c(1, 2, 4,
4, 5, 6), test3 = c(0, 2, 4, 4, 5, 6), test4 = c(1, 2, 3, 4,
5, 6)), .Names = c("test1", "test2", "test3", "test4"), row.names = c(NA,
-6L), class = "data.frame")
for(i in 1:(ncol(df)-1)){
for(j in 2:ncol(df)){
if(i == j) NULL
else if(FALSE %in% paste0(df[,i] == df[,j])) NULL
else print(paste(i, j, sep = " + "))
}
}
new <- df[,-4]
names(new)[1] <- paste(names(df[1]), names(df[4]), sep = "+")
new
好的,使用来自的想法改进上述答案。将重复列和非重复列保存到数据帧中。检查非重复项是否与任何重复项匹配,如果匹配,则连接它们的列名。因此,如果您有两个以上的重复列,这将起作用 编辑:将摘要更改为摘要。这有助于处理字符数据
df <- structure(list(test1 = c(1, 2, 3, 4, 5, 6), test2 = c(1, 2, 4,
4, 5, 6), test3 = c(0, 2, 4, 4, 5, 6), test4 = c(1, 2, 3, 4,
5, 6)), .Names = c("test1", "test2", "test3", "test4"), row.names = c(NA,
-6L), class = "data.frame")
library(digest)
nondups <- df[!duplicated(lapply(df, digest))]
dups <- df[duplicated(lapply(df, digest))]
for(i in 1:ncol(nondups)){
for(j in 1:ncol(dups)){
if(FALSE %in% paste0(nondups[,i] == dups[,j])) NULL
else names(nondups)[i] <- paste(names(nondups[i]), names(dups[j]), sep = "+")
}
}
nondups
编辑:这部分是新的
示例3:在大型数据帧上
#Creating a 1500 column by 15000 row data frame
dat <- do.call(data.frame, replicate(1500, rep(FALSE, 15000), simplify=FALSE))
names(dat) <- 1:1500
#Fill the data frame with LETTERS across the rows
#This part may take a while. Took my PC about 23 minutes.
start <- Sys.time()
fill <- rep(LETTERS, times = ceiling((15000*1500)/26))
j <- 0
for(i in 1:nrow(dat)){
dat[i,] <- fill[(1+j):(1500+j)]
j <- j + 1500
}
difftime(Sys.time(), start, "mins")
#Run the function on the created data set
#This took about 4 minutes to complete on my PC.
start <- Sys.time()
result <- dupcols(df = dat)
difftime(Sys.time(), start, "mins")
names(result$df1)
ncol(result$df1)
ncol(result$df2)
我们不得不假设你用谷歌搜索删除了重复的列。请澄清为什么前几次点击没有帮助。否则,这个问题将作为一个重复问题结束。是的,我有。请查看结果表中的列名。我不仅想删除重复的列。我还想在删除重复列后合并重复列的列名。我可以为我发布的简单表手动执行此操作,但我想在大型数据集上使用此操作。您提前知道哪些列是重复的吗?或者你想自动确定我想自动确定。我想类似的方法会起作用:DuplicatedDTDFMatch和unique可以处理这里的列表data.frame,因此matchdf、unique.defaultdf可以为相同的列提供映射,这是一个简单的开始。你的数据有多大?有多少个唯一的值?这似乎是一个好的开始,但如果有两个以上的列具有相同的数据,则它不起作用,因为它将查找所有可能的对…我正在寻找一种不必手动删除和重命名列的方法,因为我可能有超过50个重复的列,我猜这可能需要一段时间来运行非常大的数据帧,例如15000 x 1500?测试它。使用我提供的示例,并多次复制数据帧,它仍然可以非常快速地工作。dfnew好的,我在一个大数据帧上测试了它,它已经运行了至少15分钟,所以我一定是做错了什么,我会努力找出它。我编辑了我的答案以改进功能,并提供了一个大数据帧上的示例,所以它与您希望如何使用它更相关。谢谢!最后你的前一个版本运行得很好,我只是需要调整一些东西,但是这个版本也很有趣。谢谢你的不同版本!
#Creating a 1500 column by 15000 row data frame
dat <- do.call(data.frame, replicate(1500, rep(FALSE, 15000), simplify=FALSE))
names(dat) <- 1:1500
#Fill the data frame with LETTERS across the rows
#This part may take a while. Took my PC about 23 minutes.
start <- Sys.time()
fill <- rep(LETTERS, times = ceiling((15000*1500)/26))
j <- 0
for(i in 1:nrow(dat)){
dat[i,] <- fill[(1+j):(1500+j)]
j <- j + 1500
}
difftime(Sys.time(), start, "mins")
#Run the function on the created data set
#This took about 4 minutes to complete on my PC.
start <- Sys.time()
result <- dupcols(df = dat)
difftime(Sys.time(), start, "mins")
names(result$df1)
ncol(result$df1)
ncol(result$df2)