#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. Извините за мое плохое объяснение и спасибо за ваш вклад!