在R中创建一个函数,在整个数据帧中将字符串转换为整数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在R中创建一个函数,在整个数据帧中将字符串转换为整数相关的知识,希望对你有一定的参考价值。

我需要在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。

答案

为什么不这样:

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)
另一答案

我建议使用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
另一答案
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))

如果你不想学习dplyr,这种方法使用基数R,但一般来说可能会非常不合适。

另一答案

如果你有一致的情况,你可以做到:

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'")

以上是关于在R中创建一个函数,在整个数据帧中将字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

在另一个数据框的转换中创建/访问数据框

r 在R中的数据帧中将空白转换为NA

如何在 SQL 中将指数和系数转换为整数值

在 R 中创建 GIF 时出现帧顺序问题(库:“magick”和“purrr”)

Spark:如何在每个执行程序中创建本地数据帧

如何在excel中将数字转换为字符串