根据多列的值从df中删除行

时间:2014-01-30 06:41:18

标签: r

我想从这个df行中删除m = f,其中t在4行之内,无论s和b的具体组合是什么。

s<- c(1,1,1,1,1,1,2,1)
b<- c(1,1,1,1,1,1,1,2)
m <- c("o","o","o","o","f","o","o","o")
data <- rnorm(8)
t <- c(1,2,3,4,5,7,8,9)
df<- as.data.frame(cbind(s,b,m,data,t))

所以在这个例子中,我想删除包含'f'的行和包含t值的行,该行的值比该行多4(所以t为5到9),前提是它们的s和b的值是与'f'所在的行相同。所以它应该删除第5行和第6行,而不是第7行,因为s与检测到'f'的位置不同,而不是第8行,因为b不同。

对不起,这是一个非常密集的问题,我无法对此进行制定。

1 个答案:

答案 0 :(得分:1)

通常认为不使用变量的函数名称是好习惯,因此我将您的样本数据重新命名为myDF。我还假设您并不是真的希望所有列都是使用cbind()得到的因素(请查看str( df )。最后,确保这样做可能是个好主意。随机数据保持一致。因此:

set.seed( 55 )
myDF <- data.frame( s = c( 1, 1, 1, 1, 1, 1, 2, 1 ),
                    b = c( 1, 1, 1, 1, 1, 1, 1, 2 ),
                    m = c( "o", "o", "o", "o", "f", "o", "o", "o" ),
                    data = rnorm( 8 ),
                    t = c( 1, 2, 3, 4, 5, 7, 8, 9 ) )

以下是我如何解决您的问题 - 我确信有更好的方法,但这至少应该有效:

n <- which( myDF$m == "f" )
m <- which( myDF$t >= myDF$t[n] & myDF$t <= myDF$t[n] + 4 )
p <- which( myDF$s == myDF$s[n] )[m]
o <- which( myDF$b == myDF$b[n] )[p]
o <- o[ !is.na( o ) ]
myDF <- myDF[ -o, ]