我有一个包含数百个变量的非常大的数据框。我想删除连续列中的变量为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
谢谢!
答案 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);
}