【问题标题】:Creating a new variable and altering dependent variables in r using ifelse使用 ifelse 在 r 中创建新变量并更改因变量
【发布时间】:2020-06-23 15:28:19
【问题描述】:

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

【问题讨论】:

  • 这里的解释和输出有逻辑问题。让我们占据第一行。 case_count &gt; 1E = 1。为什么是F = 0
  • @csgroen apoligies,它是 e = 1,f =0。

标签: r if-statement dplyr across


【解决方案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 有更多的列,这与这个计算无关。 c_across() 是否允许我将其限制为仅 4 列而不触及其他列?
  • 是的,acrossc_across 将仅对选定的列进行操作。这些新功能的参考here
  • 好的很棒,但是如果变量不是连续的怎么办?因此,就像 Var 名称 A B C BANANA D 一样。我怎样才能让它做我只需要 ABCD 的东西?
  • 您只需一一指定:c(A, B, C, D)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多