根据多列中的值删除R中的行

时间:2018-12-15 00:46:07

标签: r

我正在尝试从数据框中删除行。

我需要删除在我提供的整个列范围内只有 个“ NONE”或空白的行。需要删除的行必须满足以下条件:1.仅“ NONE”和空白或所有“ NONE”或所有空白的组合。

因为有些情况下某些列中有“ NONE”或空白是可以的,所以我不能像在csv中读取行那样仅仅滤除行

dataframe$col1 =="NONE" | str_length(dataframe$col1)==0

我知道这通常是一个简单的问题,我可以运行一个for循环,将数据帧中的所有“ NONE”值和空格都转换为NA,并在需要的任何列上使用complete.cases({{3} }。但是,特别要求我使用不更改值的方法。有什么建议么?

编辑:我没有数据,但这是一个数据框的虚构示例,与我必须使用的数据类似

doc

在此数据框中,唯一必须删除的行是第3行(如果包含标题,则为第4行)。

最终的数据集将比这个组成的示例多得多的列

4 个答案:

答案 0 :(得分:2)

我建议使用dplyr软件包(tidyverse库的一部分)中的filter()命令。看起来像这样:

dataframe_new <- filter(dataframe, col1 == "" | str_length(col1) == 0)

答案 1 :(得分:2)

由于需要删除具有NONE和空格的行,因此将是:

dataframe <- filter(dataframe, col1 != "NONE" & str_length(col1) != 0)

答案 2 :(得分:2)

您可以使用dplyr::filter_all()完成此操作:

library(dplyr)

df <- data.frame(column.1 = c('a', 'b', 'NONE', 'b', 'b'),
                 column.2 = c('a', 'b', '', 'b', 'b'),
                 column.3 = rep('', 5),
                 column.4 = rep('', 5),
                 column.5 = rep('', 5))

df %>%
  filter_all(any_vars(. != 'NONE' & . != ''))

答案 3 :(得分:1)

function resize() {
    mainCanvas.width = window.innerWidth;
    mainCanvas.height = window.innerHeight;
    ctx.setTransform(1, 0, 0, 1, 0, 0);

    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    ctx.scale(window.innerWidth/canvasWidth, window.innerHeight/canvasHeight);
    //transX and transY are the amount needed to transform the canvas
    //so the character is in the centre of the screen
    ctx.translate(transX, transY);
}

function draw() {
    //gets called every frame

    //draws everything on canvas
    mainCtx.clearRect(0, 0, mainCanvas.width, mainCanvas.height);
    mainCtx.drawImage(canvas, 0, 0);
}

现在您可以对其进行测试:

is.none <- function(x) tolower(x) == "none"
is.whitespace <- function(x) grepl("^\\s+$", x)
is.empty <- function(x) length(x) == 0 || x == "" || is.na(x) || is.nan(x)
is.none.whitespace.empty <- function(x) is.none(x) || is.whitespace(x) || is.empty(x)

is.none.whitespace.empty <- Vectorize(is.none.whitespace.empty)

remove.empty.rows <- function(df, cols) {
  df[!sapply(1:nrow(df), 
             function(i) all(is.none.whitespace.empty(df[i, cols]))), ]
}