所以我有行删除这个问题。我所追求的是在df $ C中第一次出现值 1 之后删除行的内容。这需要在df $ A中的每个值和df $ B中的每个值发生,如果这清楚的话。下面是df的一个例子。任何帮助将不胜感激!
A B C
1 1 0
1 1 0
1 1 1
1 1 0
1 1 0
1 2 0
1 2 1
2 1 0
2 1 1
2 1 0
答案 0 :(得分:1)
让我们创建你的data.frame:
my.df <- read.table(text="A B C
1 1 0
1 1 0
1 1 1
1 1 0
1 1 0
1 2 0
1 2 1
2 1 0
2 1 1
2 1 0", header=TRUE)
让我们在C列中找到1的第一个匹配。match
找到出现的第一个位置,所以我希望它不会通过搜索1s的所有列(但我没有检查是否是真)。
WhereAreYou <- match(1, my.df$C)
现在让我们对初始data.frame进行子集化。
new.df <- my.df[1:WhereAreYou, ]
我们选择从1到WhereAreyou以及所有列的行。
答案 1 :(得分:0)
您问题的另一个答案是使用哪个声明......
new.df=my.df[1:which(my.df$C==1)[1],]
通过这种方式,您可以检查数据的逻辑操作
答案 2 :(得分:0)
一点清洁:
keep <- with(mydf, {
keeper <- tapply(C, list(A, B), FUN = function(x) {
n <- rep(0, length(x))
n[1:(which(x == 1)[1])] <- 1
n
})
as.logical(unlist(keeper))
})
mydf[keep, ]
# A B C
# 1 1 1 0
# 2 1 1 0
# 3 1 1 1
# 6 1 2 0
# 7 1 2 1
# 9 2 1 1
# 10 2 1 0
这是一种笨拙的方式来做我认为你想要做的事情:
mydf$rn <- 1:nrow(mydf)
out <- do.call(rbind,
by(mydf, mydf[1:2], FUN=function(x)
x[1:(which(x$C == 1)[1]), ]))
out[order(out$rn), ]
# A B C rn
# 1 1 1 0 1
# 2 1 1 0 2
# 3 1 1 1 3
# 6 1 2 0 6
# 7 1 2 1 7
# 8 2 1 0 8
# 9 2 1 1 9
这里的基本假设是,当您编写“这需要df$A
中的每个值以及df$B
”中的每个值时,您正在处理列A和B以某种方式对变量进行分组(在这种情况下,使用“1,1”,“1,2”和“2,1”的唯一组。
请注意,已删除第4行,第5行和第10行。创建“rn”列是为了能够方便地对输出进行排序,否则保留原始行顺序。