使用 ifelse 在 r 中创建一个新变量并更改因变量

Creating a new variable and altering dependent variables in r using ifelse

假设我们有一个 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

使用 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

你可以尝试这个解决方案(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