无法获得dplyr filter_与数据集和COL_NAME作为变量

无法获得dplyr filter_与数据集和COL_NAME作为变量

问题描述:

我撞我的头的最后几个小时,但仍然未能解决这方面的工作...无法获得dplyr filter_与数据集和COL_NAME作为变量

我想写A 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

,我相信你将需要'lazyeval ::插补'。看到答案[这里](http://*.com/questions/26492280/non-standard-evaluation-nse-in-dplyrs-filter-pulling-data-from-mysql) – aosmith

使用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")

+0

挑战是确定列名称(这是一个变量)。 @aosmith指出的解决方案工作。但我完全喜欢你用NA代替“N/A”的想法。将来会使用它。谢谢! – KalC

+0

啊,这是更有意义,是一个更好的问题。我误解了这个问题是关于在期望的列中过滤NAs,并指出你不需要为此编写自己的函数。 – TClavelle