Фильтровать данные, удалить весь фрейм данных - PullRequest
0 голосов
/ 23 октября 2018

Мои данные таковы:

X1e  X2e  X3e  X4e
360    0    0    0
360    0    0    0
260    0    0    0
0      0    0    0
0      0    0    0
0      0    0    0
90     0    0    0
360    0  360    0
360    0  360  260

Я хочу удалить столбцы X1e X4e в диапазоне от 0 до 270, не удалить 0 строку

for (i in c(1,4)){
  e <- assign(paste("X",i, "e",sep = ""),i)
  dat <- dat[with(dat, !((e>0)&(e<270))), ] 
}

Это удалит все мои данныеи моя дата стала пустой.Где моя проблема?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Создайте интересующие имена столбцов

cidx <- paste0("X", c(1, 4), "e")

Выполните логические операции с каждым столбцом

test <- !(df[,cidx] > 0 & df[,cidx] < 270)

Сумма (логическая 'и') по строкам, чтобы найти те, где находятся все столбцыTRUE

ridx <- rowSums(test) == length(cidx)

Подмножество исходных данных. Рамка

df[ridx,]
0 голосов
/ 23 октября 2018

Base R Решение:

dat[!(dat$X1e>0 & dat$X1e<270) & !(dat$X4e>0 & dat$X4e<270),]

ИЛИ

Использование sqldf:

library(sqldf)
sqldf("select * from dat where X1e not between 1 AND 270 AND X4e not between 1 AND 270")

Выход:

   X1e X2e X3e X4e
1 360   0   0   0
2 360   0   0   0
3   0   0   0   0
4   0   0   0   0
5   0   0   0   0
6 360   0 360   0
0 голосов
/ 23 октября 2018

Еще одно решение.
Мне обычно не нравится subset, потому что он использует нестандартную оценку и идет медленно, но здесь все идет.

subset(df, (X1e <= 0 | X1e >= 270) & (X4e <= 0 | X4e >= 270))
#  X1e X2e X3e X4e
#1 360   0   0   0
#2 360   0   0   0
#4   0   0   0   0
#5   0   0   0   0
#6   0   0   0   0
#8 360   0 360   0
0 голосов
/ 23 октября 2018

Как это?

library(tidyverse)
 df<-read.table(text="X1e  X2e  X3e  X4e
 360    0    0    0
            360    0    0    0
            260    0    0    0
            0      0    0    0
            0      0    0    0
            0      0    0    0
            90     0    0    0
            360    0  360    0
            360    0  360  260",header=T)
 df%>%
   filter_at(vars(X1e,X4e), all_vars(.<=0 | .>270))
  X1e X2e X3e X4e
1 360   0   0   0
2 360   0   0   0
3   0   0   0   0
4   0   0   0   0
5   0   0   0   0
6 360   0 360   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...