【问题标题】:Removing a particular category from a data frame in R从 R 中的数据框中删除特定类别
【发布时间】:2010-09-28 13:30:02
【问题描述】:

我在 R 的数据框中有一列看起来像这样:

blue
green
blue
yellow
black
blue
green

如何删除所有指示蓝色的行?请记住,我不希望在该行中显示 NULL 值:我希望删除整行。

谢谢你:)

【问题讨论】:

  • 你能给我们 dput(head(dframe,n=5)) 吗?我知道这非常冗长,但无论如何都要这样做。在没有任何其他信息的情况下评论“您仍然有麻烦”,无法帮助您。

标签: r dataframe


【解决方案1】:

还要注意因子变量字符向量之间的区别。

默认情况下,因子会保留所有原始级别,除非您将更改后的向量重新分配为新因子,或使用其中一个重新调整函数。

> DF <- data.frame(v = factor(c("red", "blue", "green", "blue")))
> summary(DF)
     v    
 blue :2  
 green:1  
 red  :1  
> summary(DF[ DF$v != "blue", , drop=FALSE])
     v    
 blue :0  
 green:1  
 red  :1  
> DF <- DF[ DF$v != "blue", , drop=FALSE]; DF$v <- factor(DF$v); summary(DF)
     v    
 green:1  
 red  :1  
> 

【讨论】:

  • 如果您不想要这种行为,则不应使用因子。
  • 我在这里没有特别的意见:我喜欢因素。我只是在为似乎是新用户的用户提供帮助——因为这些用户最有可能落入 R 的默认值 stringsAsFavtors 提供的陷阱。
【解决方案2】:

怎么样

> df1 = data.frame(a=c("Red", "Blue", "Red"), b=1:3)
> df1[df1$a!= "Blue",]
    a b
1 Red 1
3 Red 3

【讨论】:

  • 感谢 csgillespie。但不幸的是仍然有麻烦。这是我输入的:datafr[datafr$"FOCUS.APP"!= "ScreenSaverEngine",] datafr 是我的数据框; FOCUS.APP 是列的名称; ScreenSaverEngine 是我要消除的行的名称。
  • @Eric :您必须删除 FOCUS.APP 周围的“”。请在复制代码时更加准时,您似乎经常犯这些错误。你看过 Owen 的 R 指南和 R 的介绍了吗?
  • @Joris:我已经在 FOCUS.APP 周围尝试了一个带有 "" 的测试用例,它奏效了。
【解决方案3】:

如果所有这些方括号、逗号和美元符号都让您感到困惑,那么为什么不尝试“子集”:

> d=data.frame(a=c("Red", "Blue", "Red"), b=1:3)
> subset(d,a!="Blue")
    a b
1 Red 1
3 Red 3

【讨论】:

  • 是子集重构变量以摆脱空级别还是保留空级别。如果后来进入 table(a) 会发生什么?
  • 正如 Farrel 建议的那样,这实际上并没有删除空级别。
【解决方案4】:
> Data[Data!="blue"]
[1] "green"  "yellow" "black"  "green"

> Data[which(Data!="blue",TRUE)]
[1] "green"  "yellow" "black"  "green"

编辑以回应 Joris 的评论(这适用于 1 列 data.frames):

> str(Data)
'data.frame':   7 obs. of  1 variable:
 $ V1: Factor w/ 4 levels "black","blue",..: 2 3 2 4 1 2 3

【讨论】:

  • 那是一个向量,不适用于数据框。在“blue”之后添加一个逗号并忘记 which() 选项,如果绝对不需要它,我想不出为什么要使用额外的功能。
  • 谢谢约书亚。我假设 Data 是数据框的名称,对吗?我试过了,但它所做的只是打印出我的数据框。这是我输入的内容: datafr[which(datafr!="ScreenSaverEngine",TRUE)] 我已将 Data 替换为我的数据框的名称,即“datafr”
  • 乔里斯和约书亚...我还是有点困惑。我添加了这样的逗号:datafr[datafr!="ScreenSaverEngine,"]。 datafr 是我的数据框,ScreenSaverEngine 是我想要删除的行。
  • @Eric :查看 csgillespie 的答案。你必须把逗号放在引号后面,而不是前面。
  • @Eric:" 后面的逗号会告诉 R 你对行感兴趣。如果你有一个 data.frame 并且 [] 中只有一个元素,R 会认为你感兴趣列。[, x] 等价于后面的语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2014-04-12
  • 2017-08-17
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多