我有一个这样的数据框:
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 解决方案。
我不知道 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