获取因子变量中水平和标签之间的原始关联。

3

我正在寻找一个函数来获取因子变量的原始映射表。我导入了一个Rdata文件,其中包含一个名为“FactVar”的因子变量。我知道“FactVar”的映射表如下:

"010025" -> city1
"015146" -> city2
"048017" -> city3
"082053" -> city4

我的数据框中,“FactVar”数据如下(前5个案例):

1: city1
2: city3
3: city4
4: city1
5: city3

所以,我的数据框中没有“city2”。我应该使用哪个函数来获取原始映射表?它是否可在我的Rdata文件中找到?
谢谢。
编辑: 我试着用一个更好的例子澄清我的问题。我有一个调查问题,其中包括以下可能的答案:
1: "Yes"
2: "No"
8: "Don't Know"
9: "Not Applicable"

我创建了一个因子变量“FactVar”:
Var <- c(1,2,1,2,2,2,1,8,1,2)
FactVar <- factor(Var, levels=c(1,2,8,9), labels=c("Yes", "No", "Don't Know", "Not Applicable")

您看,我的Rdata文件中有一个因子变量,其中没有数据与级别“不适用”相关联。我该如何获得与我的调查问题中的原始映射表相同的内容?


levels(FactVar[[1]]) 给你什么结果? - Konrad Rudolph
我只得到了标签,比如“城市1”,“城市2”等。 - Scido
你能够上传你的输入吗?你的数据框叫什么名字?你说你有一个因子,但是显然你定义了四个包含字符串的变量?抱歉,这一点都不清楚! - Colonel Beauvel
@Scido 抱歉,我想说的是 as.numeric 而不是 levels。我感到困惑是因为你的因子看起来像字符串而不是数值变量 - 那里发生了什么? - Konrad Rudolph
5个回答

3
我认为答案是否定的。虽然我没有任何明确的信息来支持这一点,但即使我仔细研究了“factor”和相关函数的文档,除非在创建因子时单独存储它们(例如作为“attribute”或保存原始函数调用),否则我不见得有任何方法可以恢复原始级别。
坦白地说,我认为这在程序设计上是一个小小的疏忽。虽然它肯定是一个边缘案例(我以前从未考虑过它),但我会在这个问题上付出赏金,并希望Dirk Eddelbuettel或其他R专家能够关注它。
编辑:我没有看到“添加悬赏”的按钮。也许它会在几天后出现(希望我还记得)。

我也对答案很感兴趣。似乎,例如,如果您想将变量转换为带标签的因子并保留原始数据,则必须创建一个新变量。 - teppo

1

抱歉@Allen,但这并没有解决我的问题。我尝试了我的例子:.levels <- levels(FactVar)h <- hash(keys = .levels,values = seq_along(.levels)),结果是:<hash> containing 4 key-value pair(s). Don't Know : 3 No : 2 Not Applicable : 4 Yes : 1 我认为@ssdecontrol是正确的,目前还没有办法获取原始映射表... - Scido

0
str(FactVar)

将会返回级别和标签之间的映射,如下所示:

FactVar <- factor(Var, levels=c(1,2,8,9), labels=c("Yes", "No", "Don't Know", "Not Applicable

并且将包括未使用因子的标签和级别。


1
抱歉@Greg,但我得到了不同的结果:因子w/ 4个级别"Yes","No","Don't Know",..:1 2 1 2 2 2 1 3 1 2。也许我应该添加一些属性?谢谢。 - Scido

0

我有一个略微不同的问题,但是基于像shadowtalker的答案,我认为答案是相同的:你无法获得关联。

我想将一个变量转换为因子并保留原始数据。似乎我必须创建一个新变量并保留两者。

R文档中的Factors help页面指出:

要将因子f转换为其原始数值,建议使用as.numeric(levels(f))[f],而不是as.numeric(as.character(f)),这样会更有效率。

例如:

> v <- c( 0, 0, 3, 0, 6, 6 )
> 
> f1 <- factor( x = v, levels = c( 0, 3, 6, 9 ) )
> 
> as.numeric( levels( f1 ) )[f1]
[1] 0 0 3 0 6 6
>
> as.numeric( as.character( f1 ) )
[1] 0 0 3 0 6 6

然而,如果因子被标记,上述两种方法都不起作用:

> f2 <- factor( x = v, levels = c( 0, 3, 6, 9 ), labels = c( "a", "b", "c", "d" ) )
> 
> as.numeric( levels( f2 ) )[f2]
Warning: NAs introduced by coercion
 [1] NA NA NA NA NA NA NA NA NA NA
>
> as.numeric( as.character( f2 ) )
Warning: NAs introduced by coercion
 [1] NA NA NA NA NA NA NA NA NA NA

如果我们看一下levels()as.character()的输出,这就很明显了:

> levels( f2 )
[1] "a" "b" "c" "d"
>
> as.numeric( levels( f2 ) )
Warning: NAs introduced by coercion
[1] NA NA NA NA
>
> as.character( f2 )
[1] "a" "a" "b" "a" "c" "c"

如果我们只使用as.numeric(),我们将得到由factor()创建的新级别值:

> as.numeric( f2 )
[1] 1 1 2 1 3 3

-1

我不确定我理解你的意思。 您可以为因子的级别指定标签。

df$FactVar <- factor(df$FactVar, levels=c(paste0("city", 1:4))) # assuming you go up to 'city4'

重点是您可以使用函数factor中的levels参数以任何顺序指定级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接