【问题标题】:change value of different columns in a tibble based on cutoffs from a different tibble根据来自不同 tibble 的截断值更改 tibble 中不同列的值
【发布时间】:2020-04-01 15:14:54
【问题描述】:

我有一个 tibble,其中包含每日不同变量的值。

library(lubridate)
library(tidyverse)


df <- tibble::tibble(date = seq.Date(ymd('2019-01-01'), ymd('2019-03-31'), by = 1),
                     high = sample(-5:100, 90, replace = T),
                     low = sample(-25:50, 90, replace = T),
                     sd = sample(5:25, 90, replace = T))

这些变量需要由在另一个小标题中找到的某些最小值和最大值绑定:

cutoffs <- tibble::tibble(var_name = c('high', 'low', 'sd'),
                      min = c(0, -5, 10),
                      max = c(75, 15, 15))

现在我想检查我原来的 df 并对其进行更改,以便将低于 min 的每个值更改为 min,并将高于 max 的每个值更改为 max,其中 min 和 max 位于截止值中。

我目前在 for 循环中执行此操作,但我觉得这里可以使用 map 之类的函数,但我不确定如何使用它。

for (i in 1:3){


a <- cutoffs$var_name[[i]]
  print(a)
  min <- cutoffs$min[[i]]
  max <- cutoffs$max[[i]]

  df <- df %>%
    mutate(!!a := ifelse(!!as.name(a) < min, min, !!as.name(a)),
           !!a := ifelse(!!as.name(a) > max, max, !!as.name(a)))

}

感谢您帮助创建不使用 for 循环的解决方案。 谢谢:)

【问题讨论】:

  • 我不明白为什么你在第二个tibble 中有三个不同的最大值和最小值。什么是highlowsd
  • 您好,很抱歉没有澄清。 cutoff tibble 中的 high、low 和 sd 是 df 中的列名。

标签: r dplyr purrr


【解决方案1】:

试试这个。它会长期旋转您的数据框,连接到截止点,然后在适用的情况下使用 case_when 替换值:

library(lubridate)
library(tidyverse)


df <- tibble::tibble(date = seq.Date(ymd('2019-01-01'), ymd('2019-03-31'), by = 1),
                     high = sample(-5:100, 90, replace = T),
                     low = sample(-25:50, 90, replace = T),
                     sd = sample(5:25, 90, replace = T)) %>% 
  pivot_longer(-date, names_to = "var_name", values_to = "value")

df

cutoffs <- tibble::tibble(var_name = c('high', 'low', 'sd'),
                          min = c(0, -5, 10),
                          max = c(75, 15, 15))

df %>% 
  left_join(cutoffs) %>% 
  mutate(value_new = case_when(value > max ~ max,
                           value < min ~ min,
                           TRUE ~ as.double(value))) %>% 
  select(date, var_name, value, value_new, min, max)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2023-03-05
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多