Как я могу переименовать факторы на основе имен столбцов другого фрейма данных?

У меня есть столбец в фрейме данных, содержащий темы:

sub <- c("A", "A", "B", "C", "C", "C", "D", "E", "F", "F")
subjects <- data.frame(sub)

У меня есть другой фрейм данных, содержащий столбцы предметов (где предметы находятся только в одном столбце):

one <- c("A", "C", "F")
two <- c("B", "D", NA)
three <- c("E", NA, NA)
newsubjects <- data.frame(one, two, three)

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

Так, например, я хочу, чтобы предметы A, C и F в первом кадре данных были переименованы в «один». Выполнение этого вручную заняло бы много времени, поэтому я надеюсь, что есть способ использовать столбцы во втором фрейме данных для этого.

Я пробовал кучу вещей с forcats::fct_recode и уровнями, но ничего не работает, потому что я неправильно использую эти функции. Например, одна из моих попыток IIRC выглядела примерно так:

subjects %>%
      mutate(new_var = forcats::fct_recode(sub,
            !!! setNames(as.character(subjects$sub), newsubjects$one)))

Что я знаю, совершенно неправильно. Часть проблемы заключается в том, что мне трудно сформулировать свою проблему таким образом, чтобы получить релевантные результаты поиска. Спасибо за любую помощь, которую вы можете предоставить, я ценю это.

Стоит ли изучать 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
0
55
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы измените форму newsubjects дольше, вы можете соединить две таблицы:

library(tidyverse)
subjects %>%
  left_join(newsubjects %>% 
            pivot_longer(everything(), names_to = "new_sub", values_to = "sub")) 

Joining, by = "sub"
   sub new_sub
1    A     one
2    A     one
3    B     two
4    C     one
5    C     one
6    C     one
7    D     two
8    E   three
9    F     one
10   F     one

Это работает с моим репрексом, но не тогда, когда я пытаюсь применить его к своим фактическим данным. Столбец «new_sub» просто заполнен NA. Мой фактический столбец «sub» составляет 14 000 строк (содержащих смесь тем и NA), в то время как столбцы в фрейме данных «newsubjects» составляют от 14 до 76 строк (и более короткие из них дополнены NA). Есть ли что-то очевидное, что мне нужно изменить при переводе на мои фактические данные?

WaspWatcher 01.12.2022 06:11
Ответ принят как подходящий

Используя purrr::map(), создайте список, сочетающий имена столбцов со значениями из newsubjects. Затем распакуйте это внутри forcats::fct_collapse(), чтобы перекодировать значения в subjects.

library(purrr)
library(forcats)

new_ids <- map(newsubjects, ~ .x[!is.na(.x)])

subjects$sub <- fct_collapse(subjects$sub, !!!new_ids)

subjects
     sub
1    one
2    one
3    two
4    one
5    one
6    one
7    two
8  three
9    one
10   one

На основе равной длины в одном, двух, трех вы также можете создать поиск

library(dplyr)

sub <- c("A", "A", "B", "C", "C", "C", "D", "E", "F", "F")
subjects <- data.frame(sub)

one <- c("A", "C", "F")
two <- c("B", "D", NA)
three <- c("E", NA, NA)

additions <- c(one, two, three)

lookup <- data.frame(
  sub = additions %>% unlist(), 
  value = rep(1:length(additions), each=length(additions[[1]])))

subjects %>% inner_join(lookup) %>% select(value)

В базе R:

gsub("\\d", "", names(unlist(newsubjects))[match(subjects$sub, unlist(newsubjects))])

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