r - 有条件地更新列中信息的更好方法
问题描述
我在一年的时间里定期收集信息。第一个收集点“t1”充当一种参考水平。
总体而言,如果返回的“值”为 4 或更高,则“颜色”列条目应为“红色”。如果小于 4,它将读取为“绿色”。
现在,如果在后续数据收集点期间,变量的值比“t1”处记录的值大 2 个或更多点,那么我想将颜色列条目更新为“蓝色”。
请参阅下面的示例...
data <- tibble::tribble(
~parent, ~variable, ~value, ~colour,
"t1", "happy", 4L, "red",
"t2", "happy", 5L, "red",
"t3", "happy", 3L, "green",
"t1", "sad", 1L, "green",
"t2", "sad", 3L, "green",
"t3", "sad", 3L, "green"
)
time <- c('t2', 't3')
my_vars <- c('happy', 'sad')
for (i in time) {
for (x in my_vars){
if (data$value[data$parent == i & data$variable == x] >=
data$value[data$parent == 't1' & data$variable == x] + 2) {
data$colour[data$parent == i & data$variable == x] <- 'blue'
} else {
data$colour[data$parent == i & data$variable == x] <- data$colour[data$parent == i & data$variable == x]
}
}
}
问:我正在寻找一种更优雅的方式来实现这一点,因为我使用的数据集具有更长的列名,而且代码难以阅读,而且只是跑出我的屏幕。我更喜欢使用一些dplyr
函数来做这件事,但最初的尝试失败了,我回到了上面更熟悉的代码结构。
此外,在现实和现实世界的数据中,我将有大约 20 多个变量。我需要防止存在抛出代码的 NA(例如,如果 t1 值是 NA,它会抛出错误)并且我不确定如何处理这种情况,因为我不熟悉它来还没有建立检查,因此在这方面的任何指示都会受到极大的欢迎。
谢谢。
解决方案
对于每个variable
,您可以将值与 进行比较ifelse
。
library(dplyr)
data %>%
group_by(variable) %>%
mutate(colour = ifelse(value - value[match('t1', parent)] >= 2, 'blue', colour)) %>%
ungroup
# parent variable value colour
# <chr> <chr> <int> <chr>
#1 t1 happy 4 red
#2 t2 happy 5 red
#3 t3 happy 3 green
#4 t1 sad 1 green
#5 t2 sad 3 blue
#6 t3 sad 3 blue
推荐阅读
- sql - 如何使用 SQL 在 excel 中运行查询?引用 jdoodle 上的表格?
- micropython - micropython 简单的 pin 输入不起作用(树莓派 pico)
- mysql - Mysql查询以查找包含“非罗马”字母的任何条目
- asp-classic - 如何使用经典 ASP 使用 Swish QR Code API?
- vue.js - 使用带有 SortableJS 和 Vue 的计算属性时如何正确重新排序数组?
- uml - 我的 UML 活动图有什么问题吗?
- git - Azure DevOps Pipeline 不会基于另一个分支触发
- distributed-database - 用于经常更改的数据的分布式数据存储
- typescript - 导入模块失败,可能需要额外的加载器
- office365 - 如何使用关键字连接微软待办与 OneNote