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

#r #dplyr #tidyverse

#r #dplyr #tidyverse

Вопрос:

У меня есть таблица A необработанных данных, в которой я пытаюсь переименовать имена столбцов и строки на основе другой таблицы, которая работает как своего рода таблица индексации.

Q1 Вопрос 2
a1 a1
a2 a2
a2 a1
a2 a2

Я создал вторую таблицу B, чтобы попытаться объединить имена rawdata с их желаемыми фактическими именами

Qtitles желаемые названия ответы желаемые ответы
Q1 У вас стресс? a1 ДА
Q1 У вас стресс? a2 НЕТ
Вопрос 2 Как часто вы тренируетесь? a1 Ежедневно
Вопрос 2 Как часто вы тренируетесь? a2 Еженедельно

Поэтому я сначала пытаюсь заменить colnames таблицы A, а затем заменить строки таблицы A, где значения зависят от того, что это один и тот же вопрос.

Обновление: мне сказали быть более кратким в том, что я ищу.

Я ищу метод обновления значений из таблицы A на основе поиска совпадений с таблицей B.

Желаемый результат:

У вас стресс? Как часто вы тренируетесь?
ДА Ежедневно
НЕТ Еженедельно
ДА Ежедневно
ДА Еженедельно

Комментарии:

1. для меня неясно, чего вы ожидаете. пожалуйста, постарайтесь быть более точным.

2. согласен, пожалуйста, предоставьте желаемый результат

3. используйте match() для имен, а затем ifelse() для строк.

4. Я обновил свой пост желаемым результатом, спасибо!

Ответ №1:

Используя tidyverse функцию, вы можете сделать это следующим образом :

 library(dplyr)
library(tidyr)

df1 %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  left_join(df2, by = c('name' = 'Qtitles', 'value' = 'answers')) %>%
  select(row, desiredtitles, desiredanswers) %>%
  pivot_wider(names_from = desiredtitles, values_from = desiredanswers) %>%
  select(-row)

# `Are you stressed?` `How often do you exercise?`
#  <chr>               <chr>                       
#1 Yes                 Daily                       
#2 No                  Weekly                      
#3 No                  Daily                       
#4 No                  Weekly                
 

данные

 df1 <- structure(list(Q1 = c("a1", "a2", "a2", "a2"), Q2 = c("a1", "a2", 
"a1", "a2")), row.names = c(NA, -4L), class = "data.frame")

df2 <- structure(list(Qtitles = c("Q1", "Q1", "Q2", "Q2"), desiredtitles = c("Are you stressed?", 
"Are you stressed?", "How often do you exercise?", "How often do you exercise?"
), answers = c("a1", "a2", "a1", "a2"), desiredanswers = c("Yes", 
"No", "Daily", "Weekly")), row.names = c(NA, -4L), class = "data.frame")
 

Комментарии:

1. Я также подумал о том, чтобы предложить ответ в тех же строках. Обновлено.

2. Это решает мою проблему, большое вам спасибо, Ронак!

Ответ №2:

Возможно, этот код не будет хорошо масштабироваться, если возникнет много вопросов, но если вы преобразуете свой tables в data.frames , вы можете использовать следующий код:

 library(dplyr)
d1 <- data.frame(Q1 = c('a1', 'a2'), Q2 = c('a1', 'a2')) # You don't even need this data
d2 <- data.frame(Qtitles = c("Q1", "Q1", "Q2", "Q2"),   
                 desiredtitles = c("Are you stressed?","Are you stressed?",
                                   "How often do you exercise?","How often do you exercise?"),  
                 answers = c("a1", "a2", "a1", "a2"),   
                 desiredanswers = c("Yes", "No", "Daily", "Weekly"))
dlist <- split(d2, d2$Qtitles)
dfinal <- lapply(dlist, function(x) {
    y <- data.frame(x$desiredanswers)
    names(y) <- unique(x$desiredtitles)
    return(y)})
dfinal <- bind_cols(dfinal)
print(dfinal)
  Are you stressed? How often do you exercise?
1               Yes                      Daily
2                No                     Weekly
 

Комментарии:

1. Спасибо. Я думаю, я мог бы использовать это в некотором роде. Моя таблица A содержит 8000 строк и использует таблицу B в качестве индекса, поэтому для моего решения требуется использование таблицы A. Извините за мое плохое объяснение и спасибо за ваш вклад!