![](/img/trans.png)
[英]Replace all 0 values with 1 in dataframe with multiple rows and columns at once
[英]Changing values in dataframe iteraring over all rows and multiple columns
我需要更改我的數據框中遍歷行的某些值。 對於每一行,如果某列中有1,則需要將其他列中的0值更改為NA。
我有一個有效的代碼,但是使用較大的數據集時速度非常慢。
data = data.frame(id=c("A","B","C"),V1=c(1,0,0),V2=c(0,0,0),V3=c(1,0,1))
cols = names(data)[2:4]
for (i in 1:nrow(data)){
if(any(data[i,cols]==1)){
data[i,cols][data[i,cols]==0]=NA
}
}
我有一個示例數據集
data
id V1 V2 V3
1 A 1 0 1
2 B 0 0 0
3 C 0 0 1
預期的(和實際的)結果是
data
id V1 V2 V3
1 A 1 NA 1
2 B 0 0 0
3 C NA NA 1
我該如何以更優化的方式編寫它?
假設您要基於V3
值更改V1
和V2
列的值,使用dplyr
會很容易。 我們可以指定誰,我們要改變值的列mutate_at
和funs
參數指定要更改值的條件。
library(dplyr)
data %>% mutate_at(vars(V1:V2), funs(replace(., V3 == 1 & . == 0, NA)))
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
我們可以在base R
執行此操作,方法是使用rowSums
創建邏輯向量,然后根據該索引更新數字列
i1 <- rowSums(data[-1] == 1) > 0
data[-1][i1,] <- NA^ !data[-1][i1,]
data
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
如果索引需要基於單個列,例如“ V3”,則將“ i1”更改為
i1 <- data$V3 == 1
並在用'i1'設置行后更新其他數字列,創建一個帶負數的邏輯矩陣( !
-對於0值返回TRUE,對於所有其他值返回FALSE)。 然后,在邏輯矩陣上使用NA^
對於TRUE返回NA,對於其他值返回1。 由於只有二進制值,因此可以更新
data[i1, 2:3] <- NA^!data[i1, 2:3]
一線可以是,
data[rowSums(data[-1]) > 0,] <- replace(data[rowSums(data[-1]) > 0,],
data[rowSums(data[-1]) > 0,] == 0,
NA)
data
# id V1 V2 V3
#1 A 1 NA 1
#2 B 0 0 0
#3 C NA NA 1
為了避免一遍又一遍地評估相同的表達式,我們可以先定義它,即
v1 <- rowSums(data[-1]) > 0
data[v1,] <- replace(data[v1,],
data[v1,] == 0,
NA)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.