1

我还有一个问题,希望得到您的帮助。我已经用谷歌搜索了,问了一个朋友并试图了解这个网站周围的类似问题/问题,但我仍然无法弄清楚......

好的,这是我的问题:我有一个涵盖 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),它是一个从“完全同意”到“完全不同意”的李克特量表,因此被编码为一个因素。我想比较随着时间的推移对这个李克特量表的回复的变化,所以我想计算它的平均值,为了这样做,它需要是数字的。这是问题的第一步......根据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

考虑到“傻瓜网站”,我将内容更改为字符,然后更改为数字

str(econ)
as.character(econ)
head(econ)
econ <- as.numeric(econ)
head(econ)

出于某种原因,这给了我一个“好”的结果,尽管“作为字符”行中的“错误”(??)......如果我选择- 我在 命令econ <- as.character(econ)后收到“警告消息:强制引入的 NA” 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)

这就是我想到的代码 - 我知道我现在必须用“econ”替换“rohdaten”,但因为我不知道“econ”是如何构建的(而且也不知道如何找出),我完全被困在这里:-/我觉得我拥有(或可能拥有,取决于我的手段是否正确......)我需要的数据,但有点无法访问它。

很抱歉我遇到了奇怪的问题,但是如果没有任何以前的经验,在没有真正指导的情况下学习编程有点困难。

非常感谢您的耐心、时间和帮助!

4

2 回答 2

3

首先,这就是为什么在转换为数字之前必须转换为字符的原因:

假设我们有一个包含少量数字的因子

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"))
于 2015-02-27T18:37:01.093 回答
0

我在 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))

我混合使用了这两种尝试,重新评估潜在值,同时将变量转换为数字值。当变量作为因子变量时,我得到的结果现在与数据集中包含的原始值一致。您可以使用此解决方案将变量的名称更改为您喜欢的任何名称,同时将它们转换为数值变量。

于 2016-12-20T07:55:44.890 回答