按同名列分组的行值总和

标签 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)]

但这有点笨拙,而且 for 循环是邪恶的。有没有办法更简单地做到这一点?

最佳答案

我们可以转置dat ,计算 rowsum每组(原始 colnamesdat ),然后将结果转回原始结构。

t(rowsum(t(dat), group = colnames(dat), na.rm = T))
#  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

关于按同名列分组的行值总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35626945/

相关文章:

python - 如何获得整个数据框而不是列的平均值?

python - 如何计算数据框列中的出现次数?

javascript - 在 Shiny 的仪表板中下载 rpivotTable 输出

r - ggplot2 意外的 vapply 错误

重命名 R 中数据框中的特定列

python - Pandas 在删除 NaN 时保留数据

r - 将多行分类为一个变量

r - bookdown 中 tikz 用法的最小工作示例?

python - 将数据帧转换为 numpy 矩阵

r - 拆分列 - 但仅当它包含一个或多个特殊字符时