Переопределить базу данных, используя ключ - PullRequest
2 голосов
/ 11 июля 2019

У меня есть набор данных для обновления с использованием набора данных ключей.Я хотел бы изменить записи в наборе данных (group_1: group_3) на их соответствующие значения.

Помните, что на самом деле мой ключевой набор данных имеет + 25k записей, и поиск эффективного решения - вот что приводит меня сюда!Вся помощь оценена.

Пример игрушки

df <- data.frame(state=rep("state_a"),
             candidate=c("a","b","c"),
             group_1= c("g_1","g_2","g_3"),
             group_2= c("g_4","g_5",NA),
             group_3= c("g_5",NA,NA))

key <- data.frame(group=c("g_1","g_2","g_3","g_4","g_5"),
              leader=c("l_1","l_2","l_3","l_4","l_4"))

Результат:

df <- data.frame(state=rep("state_a"),
             candidate=c("a","b","c"),
             group_1= c("g_1","g_2","g_3"),
             group_2= c("g_4","g_5",NA),
             group_3= c("g_5",NA,NA))

ДОПОЛНИТЕЛЬНАЯ ЗАПРОС: Я хотел бы использовать df_2 (того же размера, что и df), чтобы решить, какие записи сохранить df_final, а затем преобразовать.

df_2 <- data.frame(state=rep("state_a"),
                   candidate=c("a","b","c"),
                   value_1= c("1","2","0"),
                   value_2= c("3","2",NA),
                   value_3= c("5",NA,NA))

df_final_temp <- data.frame(state=rep("state_a"),
             candidate=c("a","b","c"),
             group_1= c("g_1","g_2",NA),
             group_2= c("g_4","g_5",NA),
             group_3= c("g_5",NA,NA))

df_final <- data.frame(state=rep("state_a"),
             candidate=c("a","b","c"),
             group_1= c("l_1","l_2",NA),
             group_2= c("l_4","l_5",NA),
             group_3= c("l_5",NA,NA))

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Другое решение будет использовать match:

df[-(1:2)] <- as.data.frame(lapply(df[-(1:2)], function(x) key[match(x, key$group),2]))
1 голос
/ 11 июля 2019

Можно использовать пару ключ / значение в качестве именованного вектора, чтобы соответствовать столбцам

df[-(1:2)] <- setNames(as.character(key$leader), key$group)[as.matrix(df[-(1:2)])]    


df
#    state candidate group_1 group_2 group_3
#1 state_a         a     l_1     l_4     l_4
#2 state_a         b     l_2     l_4    <NA>
#3 state_a         c     l_3    <NA>    <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...