Удалить строки с коэффициентом, если в другом столбце появляется нулевое значение - PullRequest
3 голосов
/ 12 марта 2019

Мой фрейм данных выглядит следующим образом:

structure(list(intype = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), .Label = c("A30", "A31", "E45"), class = "factor"), 
    inerror = c(0.54, 0.14, 0.94, 0, 2.11, 0, 1.42, 3.19, 0), 
    inmethod = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L
    ), .Label = c("A", "B", "C"), class = "factor")), row.names = c(NA, 
-9L), class = "data.frame")

+--------+---------+----------+
| intype | inerror | inmethod |
+--------+---------+----------+
| A30    |    0.54 | A        |
| A30    |    0.14 | B        |
| A30    |    0.94 | C        |
| A31    |    9.20 | A        |
| A31    |    2.11 | B        |
| A31    |   -1.55 | C        |
| E45    |    1.42 | A        |
| E45    |    3.19 | B        |
| E45    |    0.00 | C        |
+--------+---------+----------+

Intype является фактором.Я хотел бы удалить все строки из фактора, если inerror<=0.

Таким образом, результирующий кадр данных будет:

+--------+---------+----------+
| intype | inerror | inmethod |
+--------+---------+----------+
| A30    |    0.54 | A        |
| A30    |    0.14 | B        |
| A30    |    0.94 | C        |
+--------+---------+----------+

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Это тоже работает.

with(dat, dat[- which(intype %in% intype[inerror <= 0]), ])

или, короче (thx @ Ронак Шах )

with(dat, dat[!intype %in% intype[inerror <= 0], ]) 

#   intype inerror inmethod
# 1    A30    0.54        A
# 2    A30    0.14        B
# 3    A30    0.94        C

Чтобы также избавиться от устаревших уровней факторов, используйте droplevels для нового фрейма данных.

dat$intype <- droplevels(dat$intype)
2 голосов
/ 12 марта 2019

Несколько способов сделать это

library(dplyr)
df %>%
  group_by(intype) %>%
  filter(all(inerror > 0))

# intype inerror inmethod
#  <fct>    <dbl> <fct>   
#1 A30       0.54 A       
#2 A30       0.14 B       
#3 A30       0.94 C    

ИЛИ это инвертированная версия

df %>%
  group_by(intype) %>%
  filter(!any(inerror <= 0))

С базой R ave

subset(df, ave(inerror > 0, intype, FUN = all))   
#and
subset(df, !ave(inerror <= 0, intype, FUN = any))      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...