如何将因子变量转换为数字 - 使用 R
how to convert a factor variable into a numeric - using R
我还有一个问题,希望得到你的帮助。我已经用谷歌搜索了,问了一个朋友,并试图了解这个网站周围的类似 problems/questions,但我仍然无法弄清楚...
好的,这是我的问题:
我有一个涵盖 1980-2012 年数据的大型数据集。
我使用 read.spss 函数将数据导入 R
rohdaten <-read.spss("C:\Users\xxxxxxx.sav", use.value.labels = TRUE, to.data.frame = TRUE,
max.value.labels = Inf, trim.factor.names = FALSE,
trim_values = TRUE, reencode = NA, use.missings = TRUE)
这似乎行得通。
然后我想分析变量 14 (v14),它是一个从 "totally agree" 到 "don't agree at all" 的李克特量表,因此被编码为一个因素。我想比较随着时间的推移对这个李克特量表的答复的变化,所以我想计算它的平均值,为了这样做,它需要是数字。这是问题的第一步...
根据 R for Dummies 我需要先将因子更改为字符,然后再将其更改为数字。好的...这是我的代码...
首先,我尝试了 recode() 函数,但它不起作用 - 然后我继续创建了一个新对象 "econ" 来计算 variable14 的副本。 (所以我不影响工作区中的原始v14数据)
rohdaten$v14_2 <- recode(rohdaten$v14, "8 = NA; 9 = NA; 0 = NA; 1 = 1; 2 = 2; 3 = 3; 4 = 4; 5 = 5; as.factor.result = FALSE") #should recode already - kinda doesn't work
class(rohdaten$v14_2) #just tells me it's a factor...
str(rohdaten$v14_2)
econ <- rohdaten$v14_2
考虑到 "for Dummies-Website",我将内容更改为字符,然后更改为数字
str(econ)
as.character(econ)
head(econ)
econ <- as.numeric(econ)
head(econ)
出于某种原因,这给了我一个 "good" 结果,尽管 "as character" 行中有 "error" (??)...
如果我选择 econ <- as.character(econ)
- 我会收到“警告消息:
在 econ <- as.numeric(econ)
命令之后通过强制引入的 NAs...
好的,我猜到目前为止它似乎以某种方式工作!?
但是我想计算每年的平均值(在变量 2 中)
我偶然发现了函数 by()
,它看起来就像我想要的那样,所以我的代码结果是:
avgEconRat <- by(data = rohdaten, INDICES = rohdaten$v2, FUN = mean, na.rm = T)
head(avgEconRat) #actually gives me some means - not sure though whether it's the real means or the means of the "factor-number" that's mentioned in the "for-dummies-website" - sorry I can't explain it better :-(
现在我似乎在 avgEconRat 对象中有了数据,但首先,我不确定我的意思是否完全正确,其次,这在某种程度上是主要问题,我该如何参考我的数据现在可以绘制了吗?
p1 <- ggplot(na.action=na.exclude, rohdaten, aes(v14, v2))
p1 + geom_point(aes(color = v652), alpha = 0.6) +
facet_grid(. ~ v5)
那是我想到的代码 - 我知道我现在必须用 "econ" 替换 "rohdaten",但是因为我不知道 "econ" 的结构(而且也不知道如何找出答案),我绝对被困在这里:-/
我觉得我拥有(或可能拥有,取决于我的手段是否正确……)我需要的数据,但有点无法访问它。
抱歉我遇到了奇怪的问题,但是没有真正的指导学习编程有点困难,没有任何以前的经验。
非常感谢您的耐心、时间和帮助!
首先,这就是为什么在转换为数字之前必须先转换为字符的原因:
假设我们有一个包含少量数字的因子
x = factor(c(1,2,7,7))
您可以像这样检查它在 R 中的表示方式:
unclass(x)
#> [1] 1 2 3 3
#> attr(,"levels")
#> [1] "1" "2" "7"
您会看到有 3 个级别,并且值表示为这 3 个级别的索引。此外,如果您直接调用 as.numeric()
,您将获得索引向量而不是您希望的值:
as.numeric(x)
#> [1] 1 2 3 3
另一方面,如果您有李克特量表,并且因子水平的顺序正确:
f = factor(c("agree","agree","somewhat agree","somewhat agree","somewhat disagree","disagree","disagree"))
levels(f)
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree"
你可能真的想要索引:
#> as.numeric(f)
[1] 1 1 3 3 4 2 2
但是,如果您的等级出现问题,例如:
f = factor(sample(c("agree","somewhat agree","somewhat disagree","disagree"),
20,
TRUE))
levels(f)
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree"
然后不要调用 as.numeric(as.character(f))
(在这种情况下没有意义),您需要重新排序因子水平,然后调用 as.numeric,如下所示:
as.numeric(factor(f,
# specifify the levels in the correct order:
levels=c("agree","somewhat agree","somewhat disagree","disagree"))
我在 1988-2012 的数据集上遇到了类似的问题,但我试图将变量的名称更改为数字。经过几个小时尝试不同的组合——我对 R 也很陌生——我找到了以下解决方案。
起初,我是这样做的:
这需要"plyr"包
library(plyr)
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan,
c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1"))
值是正确的,但 R 没有将变量识别为数字变量。因此不可能绘制直方图或回归图。
然后我这样做了:
伊斯兰巨兽
my.data2$islamic_leviathan <- c("3", "2", "1", "-1")
my.data2$islamic_leviathan_score <- as.factor(my.data2$islamic_leviathan)
my.data2$islamic_leviathan_score
my.data2$islamic_leviathan_score_1 <-as.numeric(as.character(my.data2$islamic_leviathan_score))
my.data2$islamic_leviathan_score_1
这个操作确实把变量从因子变成了数值,但是问题是结果(变量的值)在这个操作之后都变了,所以我的结果是完全错误的。
我刚才所做的——似乎解决了问题——是这样的:
library(plyr)
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan,
c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1"))
my.data2$islamic_leviathan_score_1 <- as.numeric(as.character(my.data2$islamic_leviathan_score))
我混合使用了两种尝试,在将变量转换为数字变量的同时重新评估潜在值。当变量作为因子变量时,我得到的结果现在与数据集中包含的原始值一致。您可以使用此解决方案将变量的名称更改为您喜欢的任何名称,同时将它们转换为数字变量。
我还有一个问题,希望得到你的帮助。我已经用谷歌搜索了,问了一个朋友,并试图了解这个网站周围的类似 problems/questions,但我仍然无法弄清楚...
好的,这是我的问题: 我有一个涵盖 1980-2012 年数据的大型数据集。 我使用 read.spss 函数将数据导入 R
rohdaten <-read.spss("C:\Users\xxxxxxx.sav", use.value.labels = TRUE, to.data.frame = TRUE,
max.value.labels = Inf, trim.factor.names = FALSE,
trim_values = TRUE, reencode = NA, use.missings = TRUE)
这似乎行得通。 然后我想分析变量 14 (v14),它是一个从 "totally agree" 到 "don't agree at all" 的李克特量表,因此被编码为一个因素。我想比较随着时间的推移对这个李克特量表的答复的变化,所以我想计算它的平均值,为了这样做,它需要是数字。这是问题的第一步... 根据 R for Dummies 我需要先将因子更改为字符,然后再将其更改为数字。好的...这是我的代码... 首先,我尝试了 recode() 函数,但它不起作用 - 然后我继续创建了一个新对象 "econ" 来计算 variable14 的副本。 (所以我不影响工作区中的原始v14数据)
rohdaten$v14_2 <- recode(rohdaten$v14, "8 = NA; 9 = NA; 0 = NA; 1 = 1; 2 = 2; 3 = 3; 4 = 4; 5 = 5; as.factor.result = FALSE") #should recode already - kinda doesn't work
class(rohdaten$v14_2) #just tells me it's a factor...
str(rohdaten$v14_2)
econ <- rohdaten$v14_2
考虑到 "for Dummies-Website",我将内容更改为字符,然后更改为数字
str(econ)
as.character(econ)
head(econ)
econ <- as.numeric(econ)
head(econ)
出于某种原因,这给了我一个 "good" 结果,尽管 "as character" 行中有 "error" (??)...
如果我选择 econ <- as.character(econ)
- 我会收到“警告消息:
在 econ <- as.numeric(econ)
命令之后通过强制引入的 NAs...
好的,我猜到目前为止它似乎以某种方式工作!?
但是我想计算每年的平均值(在变量 2 中)
我偶然发现了函数 by()
,它看起来就像我想要的那样,所以我的代码结果是:
avgEconRat <- by(data = rohdaten, INDICES = rohdaten$v2, FUN = mean, na.rm = T)
head(avgEconRat) #actually gives me some means - not sure though whether it's the real means or the means of the "factor-number" that's mentioned in the "for-dummies-website" - sorry I can't explain it better :-(
现在我似乎在 avgEconRat 对象中有了数据,但首先,我不确定我的意思是否完全正确,其次,这在某种程度上是主要问题,我该如何参考我的数据现在可以绘制了吗?
p1 <- ggplot(na.action=na.exclude, rohdaten, aes(v14, v2))
p1 + geom_point(aes(color = v652), alpha = 0.6) +
facet_grid(. ~ v5)
那是我想到的代码 - 我知道我现在必须用 "econ" 替换 "rohdaten",但是因为我不知道 "econ" 的结构(而且也不知道如何找出答案),我绝对被困在这里:-/ 我觉得我拥有(或可能拥有,取决于我的手段是否正确……)我需要的数据,但有点无法访问它。
抱歉我遇到了奇怪的问题,但是没有真正的指导学习编程有点困难,没有任何以前的经验。
非常感谢您的耐心、时间和帮助!
首先,这就是为什么在转换为数字之前必须先转换为字符的原因:
假设我们有一个包含少量数字的因子
x = factor(c(1,2,7,7))
您可以像这样检查它在 R 中的表示方式:
unclass(x)
#> [1] 1 2 3 3
#> attr(,"levels")
#> [1] "1" "2" "7"
您会看到有 3 个级别,并且值表示为这 3 个级别的索引。此外,如果您直接调用 as.numeric()
,您将获得索引向量而不是您希望的值:
as.numeric(x)
#> [1] 1 2 3 3
另一方面,如果您有李克特量表,并且因子水平的顺序正确:
f = factor(c("agree","agree","somewhat agree","somewhat agree","somewhat disagree","disagree","disagree"))
levels(f)
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree"
你可能真的想要索引:
#> as.numeric(f)
[1] 1 1 3 3 4 2 2
但是,如果您的等级出现问题,例如:
f = factor(sample(c("agree","somewhat agree","somewhat disagree","disagree"),
20,
TRUE))
levels(f)
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree"
然后不要调用 as.numeric(as.character(f))
(在这种情况下没有意义),您需要重新排序因子水平,然后调用 as.numeric,如下所示:
as.numeric(factor(f,
# specifify the levels in the correct order:
levels=c("agree","somewhat agree","somewhat disagree","disagree"))
我在 1988-2012 的数据集上遇到了类似的问题,但我试图将变量的名称更改为数字。经过几个小时尝试不同的组合——我对 R 也很陌生——我找到了以下解决方案。
起初,我是这样做的:
这需要"plyr"包
library(plyr)
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan,
c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1"))
值是正确的,但 R 没有将变量识别为数字变量。因此不可能绘制直方图或回归图。
然后我这样做了:
伊斯兰巨兽
my.data2$islamic_leviathan <- c("3", "2", "1", "-1")
my.data2$islamic_leviathan_score <- as.factor(my.data2$islamic_leviathan)
my.data2$islamic_leviathan_score
my.data2$islamic_leviathan_score_1 <-as.numeric(as.character(my.data2$islamic_leviathan_score))
my.data2$islamic_leviathan_score_1
这个操作确实把变量从因子变成了数值,但是问题是结果(变量的值)在这个操作之后都变了,所以我的结果是完全错误的。
我刚才所做的——似乎解决了问题——是这样的:
library(plyr)
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan,
c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1"))
my.data2$islamic_leviathan_score_1 <- as.numeric(as.character(my.data2$islamic_leviathan_score))
我混合使用了两种尝试,在将变量转换为数字变量的同时重新评估潜在值。当变量作为因子变量时,我得到的结果现在与数据集中包含的原始值一致。您可以使用此解决方案将变量的名称更改为您喜欢的任何名称,同时将它们转换为数字变量。