Создание функции в R, которая преобразует строки в целые числа во всем фрейме данных - PullRequest
1 голос
/ 04 апреля 2019

Мне нужно создать функцию в R, которая преобразует все записи кадра данных, которые являются символьными строками, в целые числа в соответствии с ранее определенным «кодом перевода».

Образец входных данных:

Question 1          Question 2    Question 3

Strongly Agree      Agree         Disagree

Strongly Disagree   Neutral       Don't Know

В наборе данных, с которым я буду работать, будет более 1000 строк и 50 столбцов.Каждый ответ должен быть переведен в целочисленное значение.Формула для перевода:

Полностью не согласен = 1, Не согласен = 2, Нейтральный = 3, Согласен = 4, Полностью согласен = 5, Не знаю = 0.

Таким образом, выходная функция для данных этого образца будет

Question 1  Question 2  Question 3

5           4           2

1           3           0

Моя попытка функции:

transform <- function(x)

{
  for (i in x[i, ]

  {
  if (i == 'Discordo fortemente')  {i == 1}
  if (i == 'Discordo')  {i == 2}
  if (i == 'Não concordo nem discordo') {i == 3}
  if (i == 'Concordo')  {i == 4}
  if (i == 'Concordo fortemente')  {i == 5}
  if (i == 'Não sei dizer')  {i == 0}
  }

}

Язык вышепортугальскийОчевидно, что код не работает, и я бился головой о стену в течение почти 2 часов.Любое решение моей проблемы приветствуется, хотя моя идея состоит в том, чтобы создать функцию, которая работает для одного столбца, а затем использовать ее с lapply.

Ответы [ 4 ]

3 голосов
/ 04 апреля 2019

Я бы рекомендовал использовать функцию case_when.Например,

library(dplyr)
x %>& 
 mutate_all(~case_when(.x == 'Discordo fortemente' ~ 1,
                       .x == 'Discordo' ~ 2, 
                       .x == 'Não concordo nem discordo' ~ 3, 
                       .x == 'Concordo' ~ 4, 
                       .x == 'Concordo fortemente' ~ 5, 
                       .x == 'Não sei dizer' ~ 0))

Здесь x - ваши данные.Этот код изменяет все столбцы.Если у вас есть другие столбцы, которые вы не хотите преобразовывать, вы можете использовать функцию mutate_at вместо mutate_all.

Если вы хотите, чтобы ваш код работал, вы должны изменить его следующим образом:

transform <- function(x) {

  y <- seq_along(x)

  for (i in 1:length(x)) {
    if (x[i] == 'Discordo fortemente')  {y[i] = 1}
    if (x[i] == 'Discordo')  {y[i] = 2}
    if (x[i] == 'Não concordo nem discordo') {y[i] = 3}
    if (x[i] == 'Concordo')  {y[i] = 4}
    if (x[i] == 'Concordo fortemente')  {y[i] = 5}
    if (x[i] == 'Não sei dizer')  {y[i]= 0}
}

  return(y)
}

transform(c("Discordo", 'Concordo fortemente', 'Não sei dizer'))
[1] 2 5 0
2 голосов
/ 04 апреля 2019

почему бы не это:

library(dplyr)
transform_fct <- function(var) {
  case_when(
    var == "Strongly disagree" ~  1,
    var == "Disagree" ~ 2,
    var == "Neutral" ~ 3,
    var == "Agree" ~ 4,
    var == "Strongly agree" ~ 5,
    var == "Don't know" ~ 0
  )
}
x <- x %>%
  mutate_all(transform_fct)
1 голос
/ 04 апреля 2019

Если у вас был последовательный случай, вы могли бы просто:

mapping <- c(`Strongly disagree` = 1, Disagree = 2, Neutral = 3, Agree = 4,
  `Strongly agree` = 5, `Don't know` = 0.)

df[] <- lapply(df, function(x) mapping[x])

или

df[] <- mapping[unlist(df)]

Поскольку у вас нет, вы можете сделать:

mapping <- setNames(mapping,toupper(names(mapping)))
df[] <- lapply(df, function(x) mapping[toupper(x)])
df
#   Question.1 Question.2 Question.3
# 1          5          4          2
# 2          1          3          0

или

df[] <- mapping[toupper(unlist(df))] # (same output)

данные

df <- read.table(header=TRUE,stringsAsFactors=FALSE,text="
'Question 1'          'Question 2'    'Question 3'
'Strongly Agree'      Agree         Disagree
'Strongly Disagree'   Neutral       'Don\\'t Know'")
1 голос
/ 04 апреля 2019
for (i in colnames(x)) {
  x[,i] <- sapply(x[,i], function(j) switch(j,
                   "Discordo fortemente" = 1,
                   "Discordo" = 2,
                   "Não concordo nem discordo" = 3,
                   "Concordo" = 4,
                   "Concordo fortemente" = 5,
                   0))
}

В этом подходе используется база R, если вы не хотите учить dplyr, но в целом это может быть не очень хорошо.

...