【问题标题】:Cannot get dplyr filter_ working with dataset and col_name as variables [duplicate]无法让 dplyr filter_ 使用数据集和 col_name 作为变量 [重复]
【发布时间】:2016-11-23 22:09:28
【问题描述】:

在过去的几个小时里,我撞到了头,但仍然无法解决这个问题......

我正在尝试编写一个 R 函数,该函数将 dataframe namecolumn name 作为变量,并尝试返回具有指定列的所有不同值的 dataframe , 减去任何 NA 或“N/A”值。

这是我的功能,

getDistinctColValues <- function(dataset, colname, removeNA = FALSE) {

  colname <- as.name(colname)
  retVector <- dataset %>% distinct_(colname)

  # Not working!
  if (removeNA == TRUE)
  {
    retVector <- filter_(retVector, colname !=  "N/A" | !is.null(colname))
  }
  return(retVector)
}

这是一个示例输出(见 N/A):

> getDistinctColValues(dataTY, "SomeColumn", TRUE)
  SomeColumn
1          BR
2          ET
3          SG
4          BV
5         N/A
6          MN
7          SP

此过滤器不起作用。 na.omit 不起作用,因为有“N/A”字符串。我不清楚选择退出 NSE。我正在使用lazyeval 包,但没有深入了解它。

任何帮助将不胜感激。

解决方案(由@aosmith 指导):

getDistinctColValues <- function(dataset, colname, removeNA = FALSE) {

  colname <- as.name(colname)
  retVector <- dataset %>% distinct_(colname)
  if (removeNA == TRUE)
  {
    filter_criteria <- interp(~v!="N/A", v=as.name(colname))
    print(filter_criteria)
    retVector <- retVector %>% filter_(filter_criteria)
  }
  return(retVector)
}

【问题讨论】:

  • 我相信你需要lazyeval::interp。看答案here

标签: r filter dplyr nse


【解决方案1】:

在使用read.csv(your_data, na.strings = c("N/A"))readr::read_csv(your_data, na = c("N/A")) 读取数据时,您应该将“N/A”指示为实际的NA

你也可以使用gsub(pattern = "N/A", replacement = NA, your_data)

那么你可以使用filter(your_data, is.na(SomeColumn)==F)

例如:

# Dummy data
your_data <- data_frame(var1 = c('A','B','C','D'),
                    SomeColumn = c('ET','AB','N/A', 'TC'))

# Replace 'N/A' with NA
your_data$SomeColumn <- gsub(pattern = 'N/A',replacement = NA, your_data$SomeColumn)

# Filter out NAs in selected column
your_data %>%
select(SomeColumn) %>%
filter(is.na(SomeColumn) == F)

# A tibble: 3 × 1
  SomeColumn
       <chr>
1         ET
2         AB
3         TC

如果出于某种原因需要将值保留为"N/A",您可以将过滤命令更改为filter(SomeColumn != "N/A")

【讨论】:

  • 挑战是识别列名(这是一个变量)。 @aosmith 指出的解决方案有效。但我完全喜欢你用 NA 替换“N/A”的想法。将来会使用它。谢谢!
  • 啊,这更有意义,是一个更好的问题。我误读了关于在所需列中过滤掉 NA 的问题,并指出您不需要为此编写自己的函数。
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2018-03-03
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多