簡體   English   中英

在所有行和多列中更改數據框迭代中的值

[英]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值更改V1V2列的值,使用dplyr會很容易。 我們可以指定誰,我們要改變值的列mutate_atfuns參數指定要更改值的條件。

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.

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