用于创建在R

时间:2018-12-15 18:50:18

标签: r function for-loop

作为一种练习,我正在创建一个函数来帮助我快速将变量重新编码为数值。创建函数的想法是将任意长度的多个值快速重新编码为数字形式。例如,如果数据集确实很长,则该函数理论上应该重新编码所有这些值,而不必手动键入将其重新编码为特定值的每种条件。

例如:

levels(d$letters)

[1] a b c d

该函数的一般形式是:

d$letters.recode[d$letters == "a"] <- 1
d$letters.recode[d$letters == "b"] <- 2
d$letters.recode[d$letters == "c"] <- 3

并使用此功能:

 rc.f <- function(a, b){
   x <- levels(a) 
   y <- length(a)
   b <- NA
   for (i in 1:y){
      z <- b[a==x[i]] <- i
  } 
}

从理论上讲,该函数的想法是创建另一个变量,其中a重新编码为1,b重新编码为2,依此类推。

但是,当我运行rc.f(d$letters, d$letters.recode)时,不会在数据集中创建任何新变量,并且该函数不会返回错误。

有什么想法吗?

谢谢。

另一个示例数据集d

说出一个受访者列表,根据他们所在的地区为他们分配一个类别:

 Respondent   Region        
     1           d
     2           b
     3           g
     4           c 
     5           e
     6           c
     7           f
     8           a

我正在寻找一种方法将d$Region重新编码为数字值,以d$Region.R

使用与上述相同的函数,我想知道是否可以通过在函数中输入d$Regiond$Region.R来使用该函数在数据框中创建另一个变量。因此,将a,b,c,[...],g重新编码为1,2,3,[...],7。

1 个答案:

答案 0 :(得分:0)

如果您想将a,b,f,d分别设为1,2,4,3,则使用以下内容

我已经为rc.f函数更新了一些代码

  • 删除了第二个参数b,因为我们给出b <-NA,所以我们不需要第二个参数
  • 我们不需要其他变量来存储b的值,因此我删除了z
  • 由于每个论点都不是因素,所以我们需要将其强制为因素
  • 我们不需要y,我们可以将length(a)直接放入for循环条件中
  • 最后但并非最不重要的最后一行是函数的输出,除非我们使用return,所以我将b放在了最后

代码是

rc.f <- function(a)
{
 a<-as.factor(a)
 x <- levels(a) 
 b <- NA
 for (i in 1:length(a))
  {
    b[a==x[i]] <- i
  }
 b
}

让我们举个例子

> l<-c("a","b","b","a","a","g","h","y","f","v","h","j","f","d","a","s","s","s")
> l
[1] "a" "b" "b" "a" "a" "g" "h" "y" "f" "v" "h" "j" "f"
[14] "d" "a" "s" "s" "s"
> rc.f(l)
[1]  1  2  2  1  1  5  6 10  4  9  6  7  4  3  1  8  8  8

如果您希望a,b,f,d为1,2,6,4,则使用以下内容

rc.f <- function(a)
{
  a<-as.factor(a)
  b <- NA
  for (i in 1:26)
  {
    b[a==letters[i]] <- i
  }
  b
}

让我们举个例子

> l<-c("a","b","b","a","a","g","h","y","f","v","h","j","f","d","a","s","s","s")
> l
[1] "a" "b" "b" "a" "a" "g" "h" "y" "f" "v" "h" "j" "f" "d"
[15] "a" "s" "s" "s"
> rc.f(l)
[1]  1  2  2  1  1  7  8 25  6 22  8 10  6  4  1 19 19 19