Попытка добавить демографические данные c в существующий набор данных с использованием кода if_else в R - PullRequest
0 голосов
/ 23 января 2020

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

Я смотрел на все oop, но не полностью понял это. Я начал использовать if_else, но это также не совсем подходит для того, что я хотел бы сделать.

По сути, мне нужно добавить столбец для соответствующей демографии c и заполнить его Значения соответствуют уже существующим значениям.

Например, для почтового индекса 25911 0,857 населения имеет белый цвет. В почтовом индексе 41041 0,952 населения составляют белые. И еще многое предстоит сделать ... У меня есть 37 почтовых индексов с 9 значениями для каждого почтового индекса.

Вот то, над чем я работаю до сих пор:

data$White <- if_else(data$Zipcode == 25911, 0.857, 0,
                  if_else(data$Zipcode ==41041, 0.952, 0,
                         if_else(data$Zipcode ==41042, 0.917, 0)))

Я знаю, что 0 в конце говорит ему заполнить 0 для каждого другого значения, но могу ли я получить его? существенно сложить и построить? Таким образом, в первом раунде введите значение для белых каждый раз, когда почтовый индекс равен 25911, во второй раз введите значение для белых каждый раз, когда почтовый индекс равен 41041 и т. Д. c. Стоит ли вместо этого попробовать al oop?

Вся помощь очень ценится! Я все еще очень плохо знаком с R и понимаю, как лучше всего его использовать.

1 Ответ

0 голосов
/ 23 января 2020

Да, как только что сказал Эндрю, возможно, лучше всего сначала создать справочную таблицу (= LUT) => создать фрейм данных с двумя столбцами (zip_code и value), например, так:

# Sample data set (because we don't have yours):
data = rbind.data.frame(cbind("dummy"="AA", "Zipcode"="41042"),
                        cbind("dummy"="BB", "Zipcode"="25911"),
                        cbind("dummy"="CC", "Zipcode"="41041"),
                        cbind("dummy"="DD", "Zipcode"="41038"),
                        cbind("dummy"="EE", "Zipcode"="05077"),
                        stringsAsFactors=F)
data_copy = data

# Build the LUT dataframe (here, only 2 vars with 3 records, but you can put 9 vars with 37 records if you need):
LUT = rbind.data.frame(cbind("zip_code"="25911", "White"=0.857, "Yellow"=0.112),
                       cbind("zip_code"="41041", "White"=0.952, "Yellow"=0),
                       cbind("zip_code"="41042", "White"=0.917, "Yellow"=NA), stringsAsFactors=F)

# Then, I load the dplyr library to get available the left_join function:
library(dplyr)

# Then, to get all the columns (here, White and Yellow) in the data object:
data <- left_join(data, LUT, by=c("Zipcode"="zip_code"))

# Or, instead of the previous line code, to get for example only the White column in the data object:
data_copy <- left_join(data_copy, LUT[, c("zip_code", "White")], by=c("Zipcode"="zip_code"))

# If you want to replace all the NA by 0 in a specific column (here, White), do this :
data_copy$White <- ifelse(is.na(data_copy$White), 0, data_copy$White)

Примечание: вы можете использовать функцию слияния вместо left_join, если хотите.

...