2017-05-10 23 views
0

我有一個數據幀「動物」:當這是連續唯一值時,將0轉換爲NAs。保留所有其他0,使用R

 ID A B C D 
1 Bear 1 1 1 0 
2 Tiger 0 0 0 0 
3 Horse 1 0 1 0 
4 Badger 0 0 0 1 
5 Rabbit 1 1 0 1 
6 Otter 0 0 0 0 
7 Peacock 1 0 0 0 

我想零點轉換隻包含零到NAS行,但留下其他零,因爲它們。我能做到這一點,如下所示:

animals$Result = rowSums(animals[2:ncol(animals)]) 

    df = data.frame() 

    for(row in 1:nrow(animals)) { 
     row = as.data.frame(animals[row,]) 
     if(row$Result == 0){ 
     row[2:5] = NA 
     } 
     df = rbind(df,row) 
     print(row)} 

df$Result = NULL 

要獲得此:

ID  A B C D 
Bear 1 1 1 0 
Tiger NA NA NA NA 
Horse 1 0 1 0 
Badger 0 0 0 1 
Rabbit 1 1 0 1 
Otter NA NA NA NA 
Peacock 1 0 0 0 

不過,我覺得應該是這樣做一個簡單的方法。在那兒?謝謝!

回答

3

我們可以在沒有循環的情況下通過創建一個邏輯向量來計算每行0的數量,並使用rowSums。基於該子集的數據集,而不在第一列和指定滿足條件到NA的行

df1[!rowSums(df1[-1]!=0), -1] <- NA 
df1 
#  ID A B C D 
#1 Bear 1 1 1 0 
#2 Tiger NA NA NA NA 
#3 Horse 1 0 1 0 
#4 Badger 0 0 0 1 
#5 Rabbit 1 1 0 1 
#6 Otter NA NA NA NA 
#7 Peacock 1 0 0 0 
0

下面是一個使用Reduce通過找到的行設定爲NA,然後lapply循環第二基R法變量,用replace做替換工作。

# find rows to set to NA 
nas <- !Reduce("|", df[-1]) 
# run through relevant variables, setting desired elements to NA 
df[-1] <- lapply(df[-1], replace, nas, NA) 

這將返回

df 
     ID A B C D 
1 Bear 1 1 1 0 
2 Tiger NA NA NA NA 
3 Horse 1 0 1 0 
4 Badger 0 0 0 1 
5 Rabbit 1 1 0 1 
6 Otter NA NA NA NA 
7 Peacock 1 0 0 0 
相關問題