无法使用dplyr filter_使用dataset和col_name作为变量

时间:2016-11-23 22:09:28

标签: r filter dplyr nse

我在最近几个小时撞了我的脑袋,但仍无法解决这个问题......

我正在尝试编写一个R函数,它将数据框名称列名称作为变量,并尝试返回一个数据框,其中包含指定列的所有不同值,减去任何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)
}

1 个答案:

答案 0 :(得分:1)

使用NAread.csv(your_data, na.strings = c("N/A"))

读取数据时,您应该将“N / A”指示为实际readr::read_csv(your_data, na = c("N/A"))

您也可以使用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")