我有一個帶有整數的資料框,如下所示:
# generate data frame
df = cbind(c(0,102,0,40,0,0), c(22,0,0,0,12,4), c(23,101,55,0,0,0),
c(0,0,0,414,0,0), c(0,0,61,0,0,112), c(0,0,0,0,20,0))
colnames(df) = c('A', 'T', 'C', 'G', 'N', 'Del')
rownames(df) = c('Pos1', 'Pos2', 'Pos3', 'Pos4', 'Pos5', 'Pos6')
df
A T C G N Del Pos1 0 22 23 0 0 0 Pos2 102 0 101 0 0 0 Pos3 0 0 55 0 61 0 Pos4 40 0 0 414 0 0 Pos5 0 12 0 0 0 20 Pos6 0 4 0 0 112 0
我還有一個帶整數的向量(對應于 df 的列索引):
# generate vector
cols = c(2,3,5,4,6,5)
現在,我想將 df 中的所有整數重置為零,這些整數存在于列索引中,列索引列在向量中,row-by-row。例如,對于第一行,我想將第 2 列重置為零,對于第二行,我想將第 3 列重置為零,等等。
我用以下代碼解決了這個問題:
for (i in c(1:nrow(df))) {
ncol = cols[[i]]
df[[i, ncol]] = 0
df
}
df
A T C G N Del Pos1 0 0 23 0 0 0 Pos2 102 0 0 0 0 0 Pos3 0 0 55 0 0 0 Pos4 40 0 0 0 0 0 Pos5 0 12 0 0 0 0 Pos6 0 4 0 0 0 0
如您所見,我的代碼按預期運行。然而,事實證明它在大型資料集上效率很低。因此,我想知道是否有比使用 for 回圈快得多的替代方法。
請注意,看起來我正在重置每一行中的最大值,但在某些情況下并非如此,它是我正在重置為零的兩個值中的較小值。所以我不能簡單地將每行中的最小值或最大值重置為零。
uj5u.com熱心網友回復:
您可以使用cbind創建行和列位置矩陣并將其替換0為如下所示。
rows <- seq_len(nrow(df))
df[cbind(rows, cols)] <- 0
結果
df
# A T C G N Del
#Pos1 0 0 23 0 0 0
#Pos2 102 0 0 0 0 0
#Pos3 0 0 55 0 0 0
#Pos4 40 0 0 0 0 0
#Pos5 0 12 0 0 0 0
#Pos6 0 4 0 0 0 0
uj5u.com熱心網友回復:
一種解決方案dplyr可能是:
df <- as.data.frame(df)
df %>%
mutate(across(everything(),
~ replace(., cols == match(cur_column(), names(cur_data())), 0)))
A T C G N Del
Pos1 0 0 23 0 0 0
Pos2 102 0 0 0 0 0
Pos3 0 0 55 0 0 0
Pos4 40 0 0 0 0 0
Pos5 0 12 0 0 0 0
Pos6 0 4 0 0 0 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/526991.html
標籤:r数据框循环代替排
