根据R中第一次出现的值删除行

时间:2014-04-14 12:36:32

标签: r row

所以我有行删除这个问题。我所追求的是在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

3 个答案:

答案 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”列是为了能够方便地对输出进行排序,否则保留原始行顺序。