我有另一个问题,希望得到你的帮助。我已经google了,问了一位朋友并试图了解这个网站上的类似问题/问题,但我仍然无法弄明白......
好的,这就是我的问题: 我有一个涵盖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),这是一个类似于#34的变焦尺度;完全同意&#34;并且根本不同意&#34;因此被编码为一个因素。我想比较一下这个类似规模的回复的变化,所以我想计算它的平均值,为了做到这一点,它需要是数字。这是问题的第一步...... 根据{{3}},我需要先将因子更改为字符,然后将其更改为数字。好吧......这是我的代码...... 首先,我尝试了无法工作的recode()函数 - 然后我继续创建了一个新对象&#34; econ&#34;它计算了变量中的变量14。 (所以我不会影响工作区中的原始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
使用&#34; for Dummies-Website&#34;记住我把东西改成字符,然后改成数字
str(econ)
as.character(econ)
head(econ)
econ <- as.numeric(econ)
head(econ)
这出于某种原因给了我一个好的&#34;结果,尽管&#34;错误&#34; (??)在&#34;中作为字符&#34;线...
如果我选择econ <- as.character(econ)
- 我会收到&#34;警告消息:
通过胁迫引入的NAs&#34;在econ <- as.numeric(econ)
命令之后......
好吧到目前为止我似乎以某种方式工作了吗??
但后来我想计算每年的平均值(在变量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)
这就是我想到的代码 - 我知道我必须更换&#34; rohdaten&#34;用&#34; econ&#34;现在,但因为我不知道&#34; econ&#34;是结构化的(并且也不知道如何找到),我完全被困在这里: - / 我觉得我有(或者可能有,取决于我的手段是否正确...)我需要的数据,但有点失去了对它的访问。
对于我的奇怪问题感到抱歉,但没有任何实际指导的学习编程在没有任何先前经验的情况下有点艰难。
非常感谢您的耐心,时间和帮助!
答案 0 :(得分:2)
首先,这就是为什么在转换为数字之前必须转换为字符的原因:
让我们说我们有一个包含少数数字的因素
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
另一方面,如果您有一个Likert量表,并且因子水平的顺序正确:
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"))
答案 1 :(得分:0)
我对1988 - 2012年的数据集有类似的问题,但我试图改变变量&#39;姓名成数字。经过几个小时尝试不同的组合 - 我也是R的新手 - 我找到了以下解决方案。
起初,我这样做:
这需要&#34; plyr&#34;封装
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))
我使用了两种尝试的混合,重新评估潜在值,同时将变量转换为数字变量。当变量作为因子变量时,我得到的结果现在与数据集中包含的原始值一致。您可以使用此解决方案将变量的名称更改为您可能喜欢的任何名称,同时将它们转换为数字变量。