1

假设我们有一个 df 如下:

A  B  C  D  E
1  1  0  0  1
0  0  1  0  0
0  0  0  0  1
1  1  1  1  0
0  1  1  0  1
1  0  1  0  0   

所以我想创建另一个变量F如果 A:D 的总和大于 1,则 F 为 1 且 A:D 为 0

此外,如果E == 1,则F = 0

所以这就是我写它的方式,但它不起作用......

#Counter
df<- df %>% 
       mutate(case_count = A+B+C+D)

df$F <- ifelse(df$E == 1, 0,
              ifelse(df$case_count > 1, 
                     df$A == 0 & 
                     df$B == 0 &
                     df$C == 0 &
                     df$D == 0 &
                     df$F == 1, 0))

那么这里的正确结果应该是

A  B  C  D  E  case_count F 
1  1  0  0  1           2 0
0  0  1  0  0           1 0
0  0  0  0  1           0 0
0  0  0  0  0           4 1
0  1  1  0  1           2 0
0  0  0  0  0           2 1
4

2 回答 2

1

使用dplyr和新功能acrossc_across

df %>% 
  rowwise() %>% 
  mutate(
    case_count = sum(c_across(A:D)),
    F_ = ifelse(E == 1, 0, ifelse(case_count > 1, 1, 0))
    ) %>% 
  mutate(across(A:D, ~ifelse(F_ == 1, 0, .)))

我命名新列F_,而不是仅仅F因为后者可能与 . 的缩写混淆FALSE

输出

# A tibble: 6 x 7
# Rowwise: 
#       A     B     C     D     E case_count    F_
#   <dbl> <dbl> <dbl> <dbl> <int>      <int> <dbl>
# 1     1     1     0     0     1          2     0
# 2     0     0     1     0     0          1     0
# 3     0     0     0     0     1          0     0
# 4     0     0     0     0     0          4     1
# 5     0     1     1     0     1          2     0
# 6     0     0     0     0     0          2     1
于 2020-06-23T15:41:28.207 回答
0

您可以尝试此解决方案(DF 是您的原始数据):

#Create index
DF$I1 <- rowSums(DF[,1:4])
DF[DF[,6]>1,1:4]<-0
#Create F
DF$F <- ifelse(DF$I1>1,1,0)
DF$F <- ifelse(DF$E==1,0,DF$F)

  A B C D E I1 F
1 0 0 0 0 1  2 0
2 0 0 1 0 0  1 0
3 0 0 0 0 1  0 0
4 0 0 0 0 0  4 1
5 0 0 0 0 1  2 0
6 0 0 0 0 0  2 1
于 2020-06-23T15:46:38.233 回答