2014-01-30 5 views
0

Я хочу удалить из этих строк df, где m = f, и где t находится в пределах 4 строк, где это происходит независимо от конкретной комбинации s и b.Удаление строк из df на основе значений нескольких столбцов

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» и строки, которые содержат т значения до 4 больше, чем этот ряд (так т от 5 до 9), при условии, что их значения s и b совпадает с строкой, где «f». Поэтому в нем следует удалить строки 5 и 6, но не строку 7, потому что s отличается от того, где было обнаружено «f», а не в строке 8, потому что b отличается.

Извините, это довольно плотный вопрос, я не смог сформулировать попытку.

ответ

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, ] 
Смежные вопросы