按行具有相同名称的列的行总和

时间:2016-02-25 12:11:56

标签: r dataframe

我有一个数据框,其中几列可能具有相同的名称。在这个小例子中,列“A”和“G”都出现两次:

    A  C  G  A  G  T
1   1 NA NA NA  1 NA
2   1 NA  5  3  1 NA
3  NA  1 NA NA NA  1
4  NA NA  1  2 NA NA
5  NA NA  1  1 NA NA
6  NA  1 NA NA NA  1
7  NA  1 NA NA NA  1

我希望为每个列名创建一个一个列的数据集。对于每一行,应使用每个列名称中值的总和(sum(..., na.rm = TRUE))替换各列值。例如,在第二行中,两个单独的“A”值(13)应替换为4。我事先并不知道多次出现哪些列名。

预期的输出将是:

#     A  C  G  T
# 1   1  0  1  0
# 2   4  0  6  0
# 3   0  1  0  1
# 4   2  0  1  0
# 5   1  0  1  0
# 6   0  1  0  1
# 7   0  1  0  1

所以我想我可以这样做:

noms = colnames(dat)
for(x in noms[duplicated(noms)]) {
  dat[ , x] = rowSums(dat[ , x == noms], na.rm = TRUE)
}
dat = dat[,!duplicated(noms)]

但这有点笨重,而且循环意味着邪恶。有没有办法更简单地做到这一点?

2 个答案:

答案 0 :(得分:8)

我们可以转置dat,计算每个组的rowsum(原始colnames的{​​{1}}),然后将结果转换回原始结构。

dat

答案 1 :(得分:0)

我们可以使用split.default按名称拆分数据帧,并使用rowSums进行逐行求和以为每个唯一名称创建一列。

sapply(split.default(df, names(df)), rowSums, na.rm = TRUE)

#  A C G T
#1 1 0 1 0
#2 4 0 6 0
#3 0 1 0 1
#4 2 0 1 0
#5 1 0 1 0
#6 0 1 0 1
#7 0 1 0 1