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





Я думаю, что лучшим подходом здесь было бы поддерживать фрейм данных, в котором есть все ключи и замены, которые вы собираетесь использовать, если полное название страны отсутствует:
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
Это отличная идея, и я бы не стал ее рассматривать. Спасибо за рекомендацию, работает отлично.
Прежде чем использовать «[» с логической индексацией для совместного условия, когда «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"))
Измените
transformнаmutate, то естьdf1 %>% mutate(x = ifelse(as.character(y) == "TWN", "Taiwan", as.character(x))). Если элементов несколько, используйте набор данных ключ / значение и присоединитесь