Изменить таблицу для определенных строк, указанных числами

Пытаюсь найти путь dplyr канонический к mutate a tibble по номеру строки.
Я рассмотрел много вопросов о переполнении стека и проблем с GH, таких функций, как row_number, if_else, case_when, но до сих пор не ясно, как правильно добиться следующего.

Минимальный пример: имея data.frame, я хотел бы обновить один из его столбцов до определенного значения (здесь NA) для определенных строк, указав индексы строк (здесь строки 2 и 4).
Обновляемый столбец не должен быть параметризован, а только номера строк.
Ниже базы R для достижения следующего.

DF = data.frame(x=5:1)
idx = c(2L, 4L)
DF[idx, "x"] = NA_integer_
DF
#   x
#1  5
#2 NA
#3  3
#4 NA
#5  1

Можно ли использовать DF %>% mutate(x = replace(x, idx, NA))

akrun 30.05.2019 17:03
replace это базовая функция R, тогда это путь dplyr? есть также if_else альтернатива
jangorecki 30.05.2019 17:04

Нет ничего плохого в том, чтобы использовать базовую функцию R внутри функции dplyr, и я не могу представить, как нет может использовать базовые функции R, даже если по какой-то причине вы хотели это сделать.

camille 30.05.2019 17:25

Кроме того, хакерский вариант DF %>% mutate(x = 'is.na<'(x, idx))

akrun 30.05.2019 17:26

@camille дело не в том, чтобы не использовать базовую функцию R в dplyr, а в том, чтобы знать канонический способ, который dplyr предлагает для достижения следующего. Как я подчеркнул в вопросе.

jangorecki 30.05.2019 17:28

Я говорю, что нет ничего плохого в том, что @akrun предлагает с replace, просто потому, что это базовая функция, она все еще должна работать. Вы также можете использовать что-то вроде mutate(x = ifelse(row_number() %in% idx, NA_integer_, x)), чтобы заменить x только в этих номерах строк.

camille 30.05.2019 17:36

Иногда кажется, что должна быть функция mutate_when, не так ли? Хотя я не знаю, есть ли он. Решение @camille if_else — это именно то, что я собирался порекомендовать; Я думаю, что это настолько близко, насколько мы собираемся подойти к каноническому.

Benjamin 30.05.2019 17:40

@camille спасибо, ваш row_number() подход выглядит аккуратно. Если бы я пошел по пути R, я бы выбрал просто TB=as_tibble(DF); TB[idx, "x"] = NA_integer_

jangorecki 30.05.2019 17:40

Вау @akrun! Мне нужна гифка с открытым ртом. Это восхитительно! Я полностью узнал что-то новое здесь, и искренне благодарю вас. Я изменил свой комментарий, так как он все еще находился в 5-минутном окне. Тогда я бы определенно рекомендовал решение base-R, и я думаю, что люди из RStudio / Tidyverse тоже!

Benjamin 30.05.2019 17:47

@akrun, DF %>% mutate(x = 'is.na<'(x, idx)) выдает "Ошибка оценки: не удалось найти функцию "is.na<"", не могли бы вы проверить?

Artem 21.06.2019 10:23

@Artem Я использую обратные кавычки, но здесь для комментариев я сделал одинарную кавычку

akrun 21.06.2019 16:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
2 702
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на отзывах @camille и согласии других комментаторов, самый аккуратный код — это mutate(x = ifelse(row_number() %in% idx, NA_integer_, x)).

КСТАТИ. Лучше использовать <- вместо = присвоений и избегать использования заглавных букв в именах объектов. Для получения дополнительной информации см. Руководство по стилю tidyverse

Итак, полный код:

library(dplyr)
df <- data.frame(x = 5:1)
idx <- c(2L, 4L)
df %>% mutate(x = ifelse(row_number() %in% idx, NA_integer_, x))

#   x
#1  5
#2 NA
#3  3
#4 NA
#5  1
<- vs = — это предмет предпочтения стиля, ни один из них не лучше. На самом деле <- имеет недостаток, заключающийся в том, что простое пространство меняет значение оператора присваивания на меньшее, чем унарный минус, подробнее об этом см.: github.com/Rdatatable/data.table/issues/…
jangorecki 21.06.2019 17:56

Хотя ваш ответ - это самый аккуратный способ добиться того, что я задал в вопросе, я не думаю, что его следует рекомендовать. Базовый способ R также работает с табличками, и IMO следует отдавать предпочтение. Принятие ответа, поскольку вопрос касался аккуратного способа. Он добавляет дополнительные накладные расходы на память, как показано на моих последних слайдах, поэтому требует больше памяти, чем базовый способ R: raw.githubusercontent.com/wiki/Rdatatable/data.table/talks/…

jangorecki 21.06.2019 18:00

Другие вопросы по теме