如何使用 dplyr 找到数据框最左边的列,右边的列全为零

问题描述 投票:0回答:1

我有一个这样的数据框:

df <- data.frame(v1=c(0,1), v2=c(0,1),v3=c(0,1), v4=c(0,1) ) %>% 
    expand(v1,v2,v3,v4)
df

# A tibble: 16 x 4
    var1  var2  var3  var4
   <dbl> <dbl> <dbl> <dbl>
 1     0     0     0     0
 2     0     0     0     1
 3     0     0     1     0
 4     0     0     1     1
 5     0     1     0     0
 6     0     1     0     1
 7     0     1     1     0
 8     0     1     1     1
 9     1     0     0     0
10     1     0     0     1
11     1     0     1     0
12     1     0     1     1
13     1     1     0     0
14     1     1     0     1
15     1     1     1     0
16     1     1     1     1

对于每一行,我想确定最左边包含零的列,这样右边的所有列也都包含 0。预期输出如下:

# A tibble: 16 x 5
    var1  var2  var3  var4 result
   <dbl> <dbl> <dbl> <dbl> <chr> 
 1     0     0     0     0 var1  
 2     0     0     0     1 NA    
 3     0     0     1     0 var4  
 4     0     0     1     1 NA    
 5     0     1     0     0 var3  
 6     0     1     0     1 NA    
 7     0     1     1     0 var4  
 8     0     1     1     1 NA    
 9     1     0     0     0 var2  
10     1     0     0     1 NA    
11     1     0     1     0 var4  
12     1     0     1     1 NA    
13     1     1     0     0 var3  
14     1     1     0     1 NA    
15     1     1     1     0 var4  
16     1     1     1     1 NA    

如果可能的话,我更喜欢 tidyverse 解决方案。

r dplyr tidyverse
1个回答
0
投票

我不知道 tidyverse 解决方案,但这是一个基本的 R 答案:

chk <- simplify2array(rev(Reduce(`+`, rev(df), accumulate=TRUE))) == 0
df$name <- names(df)[max.col(chk, "first")]
df$name[rowSums(chk) == 0] <- NA
df

### A tibble: 16 × 5
##      v1    v2    v3    v4 name 
##   <dbl> <dbl> <dbl> <dbl> <chr>
## 1     0     0     0     0 v1   
## 2     0     0     0     1 NA   
## 3     0     0     1     0 v4   
## 4     0     0     1     1 NA   
## 5     0     1     0     0 v3   
## 6     0     1     0     1 NA   
## 7     0     1     1     0 v4   
## 8     0     1     1     1 NA   
## 9     1     0     0     0 v2   
##10     1     0     0     1 NA   
##11     1     0     1     0 v4   
##12     1     0     1     1 NA   
##13     1     1     0     0 v3   
##14     1     1     0     1 NA   
##15     1     1     1     0 v4   
##16     1     1     1     1 NA   
© www.soinside.com 2019 - 2024. All rights reserved.