首页 > 解决方案 > 用于创建新变量的函数在 R 中不起作用

问题描述

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

例如:

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。

标签: rfunctionfor-loop

解决方案


如果你想 a,b,f,d 为 1,2,4,3 然后使用以下

我已经稍微更新了你的函数 rc.fa 的代码

  • 删除了第二个参数 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

推荐阅读