【问题标题】:Filtering a data frame in R and an unwanted filtered out result过滤 R 中的数据框和不需要的过滤结果
【发布时间】:2013-05-15 22:41:43
【问题描述】:

这个sn-p:

names<-c("Alice","Bob","Charlie")
ages<-c(25,24,25)
friends<-data.frame(names,ages)
a25 <- friends[friends$age==25,]
a25
table(a25$names)

给我这个输出

    names ages
1   Alice   25
3 Charlie   25

  Alice     Bob Charlie 
      1       0       1

现在,既然数据框a25 不包含“Bob”,为什么输出中会出现“Bob”?我希望得到这样的输出(来自table 命令):

  Alice  Charlie 
      1        1 

我错过了什么?

我的环境:

R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

【问题讨论】:

  • 您的 names 变量已转换为因子。 table 会显示每个因子级别的计数,即使它们的计数为 0。
  • @juba 谢谢,所以当我创建a25 变量时,它是否“继承”了三个级别的因素?
  • a25 不是变量,它是一个数据框,它是friends 的子集。所以它从friends 继承了age 因子及其所有级别,是的。
  • @juba 好的,我明白了。是否有可能得到我期望的结果?
  • 你可以试试a25$age &lt;- factor(a25$age)。或者将您的变量保留为characterstringsAsFactors=FALSEdata.frame

标签: r filter dataframe subset


【解决方案1】:

这个问题似乎在 cmets 中有答案。这个答案分享了另一种方法,并整合了 cmets 的建议。

您描述的问题如下:您的“a25$names”变量中没有“Bob”,但是当您使用table 时,出现了“Bob”。这是因为原始列中存在的级别已被保留。

table(a25$names)
# 
#   Alice     Bob Charlie 
#       1       0       1 

幸运的是,有一个名为 droplevels 的函数可以处理这样的情况:

table(droplevels(a25$names))
# 
#   Alice Charlie 
#       1       1 

droplevels 函数也可以在data.frame 上工作,允许您执行以下操作:

a25alt <- droplevels(friends[friends$ages==25,])
a25alt
#     names ages
# 1   Alice   25
# 3 Charlie   25
table(a25alt$names)
# 
#   Alice Charlie 
#       1       1 

如cmets中提到的,也请看as.characterfactor

table(as.character(a25$names))
table(factor(a25$names))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2013-01-09
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多