r - 如何使用 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
解决方案
你不需要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")
推荐阅读
- javascript - 在 Javascript 中的字符串中使用通配符
- numpy - 我的特征规范化是否正确(python 和 numpy)
- python - 使用 Python 从 hdf5 文件到 csv 文件
- ios - 强制更新/重置主屏幕小部件扩展配置
- ios - 致命错误:找不到模块“firebase_auth”@import firebase_auth
- python - PySimpleGui如何在画布中绘制而不出现在单独的窗口中
- generics - 如何将泛型类型转换为原始类型
- php - php dom 文档动态选择选项
- java - Gson 无法调用自定义序列化程序
- javascript - 如何使字符串的一部分变为粗体?