簡體   English   中英

按行具有相同名稱的列的行總和

[英]Row-wise sum of values grouped by columns with same name

我有一個數據框,其中幾列可能具有相同的名稱。 在這個小例子中,列“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)]

但這有點笨拙,因為循環意味着邪惡。 有沒有辦法更簡單地做到這一點?

我們可以轉置dat ,計算rowsum (原始dat colnames ),然后將結果轉換回原始結構。

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

我們可以使用名稱拆分數據框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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM