首页 > 解决方案 > 如何使用 dplyr mutate 引用 ifelse 中的其他列

问题描述

数据集示例如下。当 temp.change == 0 时,我想让 R 将上面 X 列中单元格的状态复制到一个新列中。我创建了另一列,将 X 列中的数据向下移动以引用它。换句话说,如果 temp.change == 0,则使 X = X_shifted。我意识到如果连续有多个 0,这也可能是这种方法的问题。二进制 X 列是许多关于列 temp.change 的 ifelse 语句的结果

temp.change     X   X_shifted
9.5             1     NA
1               1     1
-0.5            1     1
-1              0     1
-0.5            0     0
0               1     0
0               1     1
3               1     1          
0               0     1          
1               1     0

有没有办法在 ifelse 语句中引用另一列?我更愿意尝试使用 找到一种方法dplyr,因为我有一个非常大的数据集而且它相当快。我已经尝试了下面的代码,以及一些非 dplyr 方法没有任何成功。

  mutate(X_fixed = ifelse(temp.change_prev==0, X_shifted, X))

预期结果:

temp.change     X   X_shifted  X_fixed
9.5             1     NA         1
1               1     1          1
-0.5            1     1          1
-1              0     1          0
-0.5            0     0          0
0               1     0          0
0               1     1          0
3               1     1          1
0               0     1          1
1               1     0          1  

标签: rif-statementdplyr

解决方案


你不需要X_shifted你可以使用lag它给你以前的价值

library(dplyr)
df %>% mutate(x_fixed = ifelse(temp.change == 0, lag(X), X))

或者,如果我们需要X最后一个非零值,temp.change我们可以使用:

df %>%
  mutate(X_fixed = replace(X, temp.change == 0,NA)) %>%
  tidyr::fill(X_fixed)

#   temp.change X X_fixed
#1          9.5 1       1
#2          1.0 1       1
#3         -0.5 1       1
#4         -1.0 0       0
#5         -0.5 0       0
#6          0.0 1       0
#7          0.0 1       0
#8          3.0 1       1
#9          0.0 0       1
#10         1.0 1       1

数据

df <- structure(list(temp.change = c(9.5, 1, -0.5, -1, -0.5, 0, 0, 
3, 0, 1), X = c(1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L)), 
row.names = c(NA, -10L), class = "data.frame")

推荐阅读