我在最近几个小时撞了我的脑袋,但仍无法解决这个问题......
我正在尝试编写一个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)
}
答案 0 :(得分:1)
使用NA
或read.csv(your_data, na.strings = c("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")