我有一个数据框,其中几列可能具有相同的名称。在这个小例子中,列“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”值( 1
和 3
)应替换为 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
每组(原始 colnames
的 dat
),然后将结果转回原始结构。
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/