Условное заполнение значений NA в R строкой

У меня есть фрейм данных в R со значениями x и y. В x есть значения NA, которые я хотел бы заполнить конкретными строками в зависимости от значений y.

Пример фрейма данных:

df1 = data.frame(x = c("Canada", "United States", NA, NA, NA), 
        y = c("CAN", "USA", "TWN", "TWN", "ARG"))

Ожидаемый результат:

df2 = data.frame(x = c("Canada", "United States", "Taiwan", "Taiwan", NA), 
        y = c("CAN", "USA", "TWN", "TWN", "ARG"))

я пытался

df2 <- df1 %>% transform(df1, x = ifelse(y == "TWN", "Taiwan", x))

но это удаляет все значения x и y для всех других наблюдений, не содержащих "TWN". Большинство других примеров, которые я нашел здесь, заменяют все значения NA, и я не могу понять, как это сделать условно для строк в другом столбце. Это нужно будет сделать с очень большими кадрами данных, так что эффективность будет идеальной.

Измените transform на mutate, то есть df1 %>% mutate(x = ifelse(as.character(y) == "TWN", "Taiwan", as.character(x))). Если элементов несколько, используйте набор данных ключ / значение и присоединитесь

akrun 26.11.2018 08:27

Мне не нравится идея жесткого кодирования, которое TWN сопоставляет с Taiwan. Я думаю, вам нужно иметь хотя бы несколько фреймов картографических данных, которые содержат эту информацию.

Tim Biegeleisen 26.11.2018 08:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
707
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Я думаю, что лучшим подходом здесь было бы поддерживать фрейм данных, в котором есть все ключи и замены, которые вы собираетесь использовать, если полное название страны отсутствует:

df1 <- data.frame(x=c("Canada", "United States", NA, NA, NA), 
                  y=c("CAN", "USA", "TWN", "TWN", "ARG"), stringsAsFactors=FALSE)

df2 <- data.frame(y=c("TWN", "ARG"), value=c("Taiwan", "Argentina"),
                  stringsAsFactors=FALSE)

result <- merge(df1, df2, by = "y", all=TRUE)
result$x <- ifelse(is.na(result$x), result$value, result$x)
result <- result[, c("y", "x")]
result

    y             x
1 ARG     Argentina
2 CAN        Canada
3 TWN        Taiwan
4 TWN        Taiwan
5 USA United States

Это отличная идея, и я бы не стал ее рассматривать. Спасибо за рекомендацию, работает отлично.

Ray B 26.11.2018 08:56

Прежде чем использовать «[» с логической индексацией для совместного условия, когда «x» является NA, а «y» - TWN, вам сначала необходимо увеличить уровни столбца факторов.

> levels(df1$x) <- c(levels(df1$x), 'Taiwan')
> df1[is.na(df1$x) & df1$y=='TWN', 'x'] <- 'Taiwan'
> df1
              x   y
1        Canada CAN
2 United States USA
3        Taiwan TWN
4        Taiwan TWN
5          <NA> ARG

Самый простой подход - использовать библиотеку data.table в R

library(data.table)

setDT(df1)

df1[y= = "TWN",x: = "TAIWAN"]

Это должно работать как профессионал.

Мне нравится использовать lookUpTable (named character) для решения этих проблем.

lookUpTable = c("Canada", "United States", "Taiwan", "Argentina")
names(lookUpTable) = c("CAN", "USA", "TWN", "ARG")

#     CAN             USA             TWN             ARG 
#"Canada" "United States"        "Taiwan"     "Argentina" 

df1$x <- lookUpTable[df1$y]

#              x   y
#1 United States CAN
#2     Argentina USA
#3        Taiwan TWN
#4        Taiwan TWN
#5        Canada ARG

данные:

df1 = data.frame(x = c("Canada", "United States", NA, NA, NA), 
                 y = c("CAN", "USA", "TWN", "TWN", "ARG"))

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