R删除多个NULL的行(已编辑)

时间:2015-12-16 19:54:30

标签: r null delete-row

我有一个包含数百个变量的非常大的数据框。我想删除连续列中的变量为NULL的行。数据框df看起来像这样:

ID     V1     V2    V3    V4    V5   V6    V7    V8    V9    V10    V11     V12
ABC    1      2     3     4     1    2     3     NULL  4      1     AB      BC
DEF    2      3     NULL  4     2    3     4     1     2      3     AB      BC
JKL    3      4     1     2     3    4     1     2     3      4     AB      BC
MNO    1      2     3     4     1    NULL  2     3     4      1     AB      BC

在这个数据框中,我想删除只有行df $ ID ==" GHI"例如,我得到:

product.Category

谢谢!

4 个答案:

答案 0 :(得分:3)

似乎是rle()的工作。

a <- !apply(df[paste0("V", 1:10)] == "NULL", 1, function(x) {
    with(rle(x), any(lengths[values] > 1))
})

df[a, ]
#    ID V1 V2   V3 V4 V5   V6 V7   V8 V9 V10 V11 V12
# 1 ABC  1  1    1  1  1    1  1 NULL  1   1  AB  BC
# 2 DEF  1  1 NULL  1  1    1  1    1  1   1  AB  BC
# 4 JKL  1  1    1  1  1    1  1    1  1   1  AB  BC
# 5 MNO  1  1    1  1  1 NULL  1    1  1   1  AB  BC

数据:

df <- structure(list(ID = c("ABC", "DEF", "GHI", "JKL", "MNO"), V1 = c("1", 
"1", "NULL", "1", "1"), V2 = c("1", "1", "NULL", "1", "1"), V3 = c("1", 
"NULL", "NULL", "1", "1"), V4 = c("1", "1", "NULL", "1", "1"), 
    V5 = c("1", "1", "NULL", "1", "1"), V6 = c("1", "1", "NULL", 
    "1", "NULL"), V7 = c("1", "1", "NULL", "1", "1"), V8 = c("NULL", 
    "1", "NULL", "1", "1"), V9 = c("1", "1", "NULL", "1", "1"
    ), V10 = c("1", "1", "NULL", "1", "1"), V11 = c("AB", "AB", 
    "AB", "AB", "AB"), V12 = c("BC", "BC", "BC", "BC", "BC")), .Names = c("ID", 
"V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", 
"V11", "V12"), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

可以使用rowSums计算“NULL”的出现次数,并通过仅保留最多一个NULL的行来对数据帧进行子集化:

newdf <- df1[rowSums(df1=="NULL")<2,]
#> newdf
#   ID V1 V2   V3 V4 V5   V6 V7   V8 V9 V10 V11 V12
#1 ABC  1  2    3  4  1    2  3 NULL  4   1  AB  BC
#2 DEF  2  3 NULL  4  2    3  4    1  2   3  AB  BC
#4 JKL  3  4    1  2  3    4  1    2  3   4  AB  BC
#5 MNO  1  2    3  4  1 NULL  2    3  4   1  AB  BC

数据:

df1 <- read.table(text="ID     V1     V2    V3    V4    V5   V6    V7    V8    V9    V10    V11     V12
ABC    1      2     3     4     1    2     3     NULL  4      1     AB      BC
DEF    2      3     NULL  4     2    3     4     1     2      3     AB      BC
GHI    NULL   NULL  NULL  NULL  NULL NULL  NULL  NULL  NULL  NULL   AB      BC
JKL    3      4     1     2     3    4     1     2     3      4     AB      BC
MNO    1      2     3     4     1    NULL  2     3     4      1     AB      BC", 
header=TRUE)

答案 2 :(得分:1)

如果您希望连续 NA或NULL,那么您可以尝试

df[-which(apply( df, 1, function(x) { seq<-which(is.na(x)); ifelse(any(diff(seq)==1),TRUE,FALSE) } )),]

否则使用sum方法。

答案 3 :(得分:0)

你可以尝试:

var transform = {x: 0, y: 0, scale: 1}
function scaleCanvas(scale, point) { 
    var oldScale = transform.scale;
    transform.scale = scale / transform.scale;

    // Re-centre the canvas around the zoom point
    // (This may need some adjustment to re-centre correctly)
    transform.x += point.x / transform.scale - point.x / oldScale
    transform.y += point.y / transform.scale - point.y / oldScale;

    setTransform();
}
function dragCanvas(x,y) {
    transform.x += x / transform.scale;
    transform.y += y / transform.scale;
    setTransform();
}
function setTransform() {
    ctx.setTransform(transform.scale, 0, 0, transform.scale, transform.x, transform.y);
}