Замена значений частями строк из списка меток [R] - PullRequest
1 голос
/ 23 февраля 2020

Я постараюсь произнести это как можно лучше, терпите меня.

У меня есть необработанные данные, состоящие из 200 столбцов. Значениям каждого столбца были присвоены номера, которые теперь необходимо заменить их базовыми значениями.

Для каждого столбца базовые значения изменяются, что делает задачу очень утомительной.

Я получил список базовых значений, но все базовые значения столбца перечислены в одной ячейке. Строка может выглядеть примерно так [«1 = Очень много 2 = Умеренно 3 = Не так много»] Я приложил картинку, чтобы попытаться помочь вам понять.

Слева мои необработанные данные и справа метки, которые я получил

Поскольку у меня есть 200 столбцов этой чепухи, «поиск и замена» в таблицах Excel были бы адом для этой задачи. Поэтому я ищу способ использовать ряды меток и автоматизировать его в R.

У меня есть только недельный опыт работы с R, поэтому я не знаю о сильных и слабых сторонах R, чтобы решить такое задание.

Спасибо всем, кто читает мой дебют в качестве романиста, я был бы признателен за любую помощь, ура!

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Применить forcats::fct_collapse к каждому столбцу в df, используя sapply

library(rlang) #for !!!
data.frame(sapply(names(df), 
                  function(x) forcats::fct_collapse(as.factor(df[[x]]), !!!lab[[x]])))

     Q1     Q2
1   Yes    All
2    NO   Some
3 Maybe Rarely
4 Maybe      4

Данные

lab <- list(Q1=c('Yes'='1','NO'='2','Maybe'='3'), Q2=c('All'='1','Some'='2','Rarely'='3'))
df <- structure(list(Q1 = c(1L, 2L, 3L, 3L), Q2 = 1:4), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 23 февраля 2020

Вы можете использовать ifelse операторы:

ОБРАЗЦЫ ДАННЫХ :

set.seed(111)
df <- data.frame(
  Q1 = sample(1:3, 10, replace = T), 
  Q2 = sample(1:4, 10, replace = T), 
  Q3 = sample(1:3, 10, replace = T)
  )

РЕШЕНИЕ :

df$Q1_new <- ifelse(df$Q1==1, "Yes",
                    ifelse(df$Q1==2, "No", "Maybe"))
df
   Q1 Q2 Q3 Q1_new
1   2  1  3     No
2   3  1  1  Maybe
3   3  2  3  Maybe
4   3  4  3  Maybe
5   1  3  1    Yes
6   3  4  3  Maybe
7   1  2  1    Yes
8   3  2  1  Maybe
9   2  1  3     No
10  1  4  1    Yes

И продолжить таким же образом для Q2 и Q3:

df$Q2_new <- ifelse(df$Q2==1, "All the time",
                    ifelse(df$Q2==2, "Some of the time",
                           ifelse(df$Q2==3, "Rarely", "Never")))
df$Q3_new <- ifelse(df$Q3==1, "6 hours",
                    ifelse(df$Q3==2, "7 hours", "8 hours"))
df
   Q1 Q2 Q3 Q1_new           Q2_new  Q3_new
1   2  1  3     No     All the time 8 hours
2   3  1  1  Maybe     All the time 6 hours
3   3  2  3  Maybe Some of the time 8 hours
4   3  4  3  Maybe            Never 8 hours
5   1  3  1    Yes           Rarely 6 hours
6   3  4  3  Maybe            Never 8 hours
7   1  2  1    Yes Some of the time 6 hours
8   3  2  1  Maybe Some of the time 6 hours
9   2  1  3     No     All the time 8 hours
10  1  4  1    Yes            Never 6 hours
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...