【问题标题】:Access factors by their underlying integer, not their level in R通过它们的基础整数访问因子,而不是它们在 R 中的级别
【发布时间】:2020-05-08 10:56:07
【问题描述】:

我经常将带有长文本的因子变量作为级别(例如,调查中的回复:“我非常同意该陈述”可能是一个级别)。如果我想根据因子变量进行子集化,总是输入完整的级别很烦人。我宁愿概述一下从底层整数到级别的映射以及基于此整数的访问。

set.seed(1896)
df <- data.frame(y = runif(100, 0, 10000), x = factor(rep(c("I strongly agree", "I agree", "I disagree", "I strongly disagree"), 25)))
mean(df$y[df$x == "I strongly agree"])

通过以下方式访问底层整数可以获得相同的结果:

mean(df$y[as.integer(df$x) == 3])

我有两个相关的问题: 1)有没有更好/更安全的方法来做到这一点?在具有值和值标签的 Stata 中,可以直接访问标签或值,R 中是否存在类似的东西? 2)有没有办法快速查看R中从整数到因子级别的映射表?一个可以给我这样一张桌子的命令: 1 - “我同意”; 2 - “我不同意”; 3 - “我非常同意”; 4 - “我强烈反对”?

提前致谢!

【问题讨论】:

  • 对于 (2) 呢:levels(df$x)?
  • ...或者更类似于“表格”的输出:data.frame(levels(df$x))

标签: r stata r-factor


【解决方案1】:

不太确定您的问题,因为我从未使用过 Stata。最重要的一步是保理部分。默认情况下,级别按字母顺序排序。

df = data.frame(y = runif(100, 0, 10000), x = rep(c("I strongly agree", "I agree", "I disagree", "I strongly disagree"), 25))

levels(df$x)
[1] "I agree"             "I disagree"          "I strongly agree"   
[4] "I strongly disagree"

为了安全起见,我猜你的意思是为每个数据集定义相同的级别。所以你可以这样做:

lvls = c("I strongly agree", "I agree", "I disagree", "I strongly disagree")
df$x = factor(df$x,levels=lvl)

levels(df$x)
[1] "I strongly agree"    "I agree"             "I disagree"         
[4] "I strongly disagree"

所以对于桌子,可能是这样的:

data.frame(num = 1:length(lvl),lvl)
  num                 lvl
1  1    I strongly agree
2  2             I agree
3  3          I disagree
4  4 I strongly disagree

您可以使用以下方法进行子集化:

df[df$x==lvl[1],]

或者:

df[df$x==levels(df$x)[1],]

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2013-12-22
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多