在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中创建一个函数,在整个数据帧中将字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章