使用%in%进行Data.frame过滤

时间:2017-07-21 09:49:41

标签: r dataframe

我有以下data.frame

  qualifiers symbols values
1        Buy    AAPL  326.0
2       Sell    MSFT  598.3
3       Sell   GOOGL  201.5

我只想保留qualifiers为“卖”的行,然后移除qualifiers列。

所以新的data.frame将是:

  symbols values
1    MSFT  598.3
2   GOOGL  201.5

这是我尝试过的:

# Select the rows with "Sell" qualifier
valid_symbols <- df$symbols[df$qualifiers == "Sell"]

# Keep only these
df <- df[df$symbols %in% valid_symbols]

# Remove qualifiers column
df$qualifiers <- NULL

第1行按预期工作:

> valid_symbols
[1] MSFT  GOOGL
Levels: AAPL GOOGL MSFT

但是第2行没有:

> df
  symbols values
1    AAPL  326.0
2    MSFT  598.3
3   GOOGL  201.5

它似乎是按列过滤而不是按行过滤。

所以我想知道:

  1. 我的代码有什么问题
  2. 是否有最有效/优雅的方式来实现我想要的目标

1 个答案:

答案 0 :(得分:1)

代码无效的原因是因为需要,。默认情况下,不使用,,它认为我们提供列索引/列名称等。

df <- df[df$symbols %in% valid_symbols,]
#OP's code
df$qualifiers <- NULL

如果非数字列为factor,那么我们可能需要用droplevels换行以删除这些列中未使用的级别

df <- droplevels(df)

但是,可以使用subset

完成此操作
subset(df, qualifiers == "Sell", select = -1)

或使用dplyr filter

library(dplyr)
df %>% 
    filter(qualifiers == "Sell") %>%
    select(2:3)