合并重复列并对R中的值求和

合并重复列并对R中的值求和,r,merge,R,Merge,我有一个很大的矩阵,物种作为列,地点作为行。它是一个存在/不存在矩阵(即每个物种可以存在=1或不存在=0) 有些物种是重复的,但它们的值不相同(即,同一物种可以出现在一个记录中,而在另一个记录中不存在) 我需要合并列,也就是说,当一个物种被复制时,我只想保留一条记录并对所有值求和 例如,给定此矩阵: A = matrix(c(1,0,1,1,1,1,0,0,1,1), nrow=2, ncol=5) colnames(A)<-c("A","B","A","A","B") A B A

我有一个很大的矩阵,物种作为列,地点作为行。它是一个存在/不存在矩阵(即每个物种可以存在=1或不存在=0)

有些物种是重复的,但它们的值不相同(即,同一物种可以出现在一个记录中,而在另一个记录中不存在)

我需要合并列,也就是说,当一个物种被复制时,我只想保留一条记录并对所有值求和

例如,给定此矩阵:

A = matrix(c(1,0,1,1,1,1,0,0,1,1), nrow=2, ncol=5)
colnames(A)<-c("A","B","A","A","B")

   A B A A B
   1 1 1 0 1
   0 1 1 0 1
但我在原始数据框中有948列和454行,这只是一个简单的示例


我曾尝试转置然后聚合,但它不起作用。

这基本上是一个循环,我们迭代每个唯一的名称,然后使用
grepl
提取具有这些名称的列并执行行和

sapply(unique(colnames(A)), function(x) rowSums(A[,grepl(x, colnames(A))]))
#      A B
# [1,] 2 2
# [2,] 1 2

现在谈谈您所面临的问题:以下面的例子为例:

A = data.frame(c("JOEL", "WILSON"),c(1,0),c(1,1),c(1,1),c(0,0),c(1,1))
colnames(A)<-c("id","A","B","A","A","B")
#       id A B A A B
# 1   JOEL 1 1 1 0 1
# 2 WILSON 0 1 1 0 1

# assuming you have first column as factor(id) 
col <- unique(colnames(A))[-1]  # -1 means remove the first unique column name which in this case is "id" a factor column

cbind(A[1], sapply(col, function(x) rowSums(A[,grepl(x, colnames(A))])))
#      id A B
#1   JOEL 2 2
#2 WILSON 1 2
A=数据帧(c(“乔尔”、“威尔逊”)、c(1,0)、c(1,1)、c(1,1)、c(0,0)、c(1,1))

colnames(A)我找到了一个解决方案,按照这篇文章中的说明对矩阵进行转置,然后对行求和:

Joel Wilson的代码就在那里,但重点是唯一的列,而不是重复的列。我在这里的答案是Joel的代码稍微修改了一下,将重点放在重复的列上

# two functions
df2 <- sapply(unique(colnames(df)[duplicated(colnames(df))]), function(x) rowSums(df[,grepl(paste(x, "$", sep=""), colnames(df))]))
df2 <- cbind(df2, df[,!duplicated(colnames(df)) & !duplicated(colnames(df), fromLast = TRUE)])

# one long function
df2 <- cbind(sapply(unique(colnames(df)[duplicated(colnames(df))]), function(x) rowSums(df[,grepl(paste(x, "$", sep=""), colnames(df))])), df[,!duplicated(colnames(df)) & !duplicated(colnames(df), fromLast = TRUE)])
编辑 我不知道
duplicate
函数将重复名称的首次出现标记为
FALSE
。我发现这有助于调试我的答案,这样第一次出现的重复列就不会包含在最终的数据集中

编辑2
在实践中使用这段代码,我发现正则表达式搜索会对互为子集的列求和。例如,如果有名为OTU_3、OTU_35和OTU_301的列,则所有名为OTU_35的列都将折叠和求和,所有名为OTU_301的列都将折叠和求和,但OTU_3将是所有名为OTU_3、OTU_35和OTU_301的列的总和。将正则表达式从
x
更改为
paste(x,“$”,sep=”“)
可以解决此问题。美元符号表示成功匹配的x后面不应该有任何其他字符

嗨,乔!感谢这一点,它看起来很有希望,但我得到了以下错误:行和中的错误(Diatosdef[,grepl(x,colnames(Diatosdef))):“x”必须是一个至少包含两个维度的数组,从以下位置调用:行和(Diatosdef[,grepl(x,colnames(Diatosdef))),这里是调试:if(!is.array(x)| length(dn@user2963185您是否错过了将
放在
A[,…]
?thta很重要我没有!我的数据名为“Diatosdef”。这是我使用的代码。我想它正是您提供的代码:sapply(unique(colnames(Diatosdef)),function(x)行和(Diatosdef[,grepl(x,colnames(Diatosdef)))@用户2963185看起来很奇怪…介意分享
类(Diatosdef)
str(Diatosdef)吗
output..
x
只是名称,不需要是二维的…我现在不确定原因…可能需要更多详细信息Hi Joel!感谢您的帮助!类是data.frame,结构:data.frame:454 obs.共951个变量。第一个变量=系数w/454个级别;其余变量=numCheck here:It帮了我。看这里:它帮了我。
A1 <- A[-1]
#A1
#  A B A.1 A.2 B.1
#1 1 1   1   0   1
#2 0 1   1   0   1
func <- function(x){
  w <- grepl(x, colnames(A))
  h <- A[, w]
  rowSums(h)
}  
debug(func)  
sapply(col, func)   # col is as above
# two functions
df2 <- sapply(unique(colnames(df)[duplicated(colnames(df))]), function(x) rowSums(df[,grepl(paste(x, "$", sep=""), colnames(df))]))
df2 <- cbind(df2, df[,!duplicated(colnames(df)) & !duplicated(colnames(df), fromLast = TRUE)])

# one long function
df2 <- cbind(sapply(unique(colnames(df)[duplicated(colnames(df))]), function(x) rowSums(df[,grepl(paste(x, "$", sep=""), colnames(df))])), df[,!duplicated(colnames(df)) & !duplicated(colnames(df), fromLast = TRUE)])
df2 <- sapply(unique(colnames(df)[duplicated(colnames(df))]), function(x) rowSums(df[,grepl(paste(x, "$", sep=""), colnames(df))]))
df2 <- cbind(df2, df[,!duplicated(colnames(df)) & !duplicated(colnames(df), fromLast = TRUE)])