Условно заполните значения NA в R строкой - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть кадр данных в 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, и я не могу понять, как это сделать условно для строк в другом столбце.Это нужно будет делать с очень большими кадрами данных, чтобы эффективность была идеальной.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Мне нравится использовать 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

data:

df1 = data.frame(x = c("Canada", "United States", NA, NA, NA), 
                 y = c("CAN", "USA", "TWN", "TWN", "ARG"))
0 голосов
/ 26 ноября 2018

Прежде чем использовать «[», необходимо сначала увеличить уровни столбца коэффициентов, чтобы логическое индексирование для совместного условия «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
0 голосов
/ 26 ноября 2018

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

library(data.table)

setDT(df1)

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

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

0 голосов
/ 26 ноября 2018

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...