R - мутировать подмножество столбцов только в подмножестве строк - PullRequest
1 голос
/ 17 марта 2020

Моя цель - изменить значения определенных столбцов (выбранных по их именам) только в подмножестве строк, которые проверяют определенное условие, используя dplyr.

У меня есть этот игрушечный фрейм данных

library(dplyr)
set.seed(42)
df1 <- data.frame(
  Date = rep(seq.Date(as.Date("2020-01-01"), as.Date("2020-01-31"), "day"), each = 24),
  A1 = runif(744, min = 0, max = 1000),
  A2 = runif(744, min = 0, max = 1000),
  B1 = runif(744, min = 0, max = 1000),
  B2 = runif(744, min = 0, max = 1000)
)

Допустим, я хочу умножить на 0,2 значения столбцов, которые начинаются с буквы "B" только в строках, для которых Date равно 2020-01-01 или 2020-01-06. Код в этом случае довольно прост:

df2 <- df1 %>% 
  mutate(
    B1 = if_else(Date %in% as.Date(c("2020-01-01", "2020-01-06")), 0.2 * B1, B1),
    B2 = if_else(Date %in% as.Date(c("2020-01-01", "2020-01-06")), 0.2 * B2, B2)
  )

Однако, если у меня много переменных, начинающихся с буквы "B", я хочу сделать это автоматически c. Я пробовал mutate_at в следующем фрагменте кода

df2 <- df1 %>% 
  mutate_at(
    vars(starts_with("B")),
    if_else(Date %in% as.Date(c("2020-01-01", "2020-01-06")), 0.2 * ., .)
  )

, но R выдает мне следующую ошибку:

Error in Date %in% as.Date(c("2020-01-01", "2020-01-06")) : 
object "Date" not found

Что я делаю не так? Я посмотрел на этот вопрос , но я хотел бы найти способ, который не определяет пользовательскую функцию.

1 Ответ

1 голос
/ 17 марта 2020

См. этот пост для получения дополнительной информации

df1 %>%
  mutate_at(vars(starts_with("B")),
            .funs = list(~ if_else(Date %in% as.Date(c("2020-01-01", "2020-01-06")), 0.2 * ., .)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...