R: отбросить все строки, которые соответствуют определенному условию - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь очистить dataframe. Я создал индикаторную переменную, равную 1, 0 или -1. Например:

Name   Indicator_1
A      1
B      0
C      1
D     -1

Теперь я пытаюсь отбросить все строки, которые> 0, что дает мне dataframe вот так:

 Name   Indicator_1
    B      0
    D     -1

До сих пор я пробовал несколько различных подходов, включая:

df <- df[df$Indicator_1 > 0,]
df <- df(df, select = -c(Indicator_1 >0))
df <- df %>% slice(-c(Indicator_1 >0))
df <-df[!(df$Indicator_1 >0),]

К сожалению, ни один из этих подходов не работает должным образом. Либо все записи становятся NA, либо ничего не происходит.

Я неправильно смотрю на это? Я был бы признателен за любую помощь, и у меня нет предпочтений по пакету.

Изменить: некоторые из Indicator_1 записей являются NA сами по себе.

Изменить: добавлен репекс

structure(list(Name = c("K", "L", "Y", 
"S", "R", "W"),Indicator_1 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), row.names = c(NA, 
6L), class = "data.frame")

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Если это числовой столбец c, методы должны работать. Если есть элементы NA, создайте логическое условие с помощью is.na

subset(df, Indicator_1 >0 & !is.na(Indicator_1))
#   Name Indicator_1
#1    A           1
#3    C           1

Если это не класс numeric и у него нет строки символов, мы можем использовать type.convert для изменить class

subset(type.convert(df, as.is = TRUE), Indicator_1 >0 & !is.na(Indicator_1))

 

данные

df <- structure(list(Name = c("A", "B", "C", "D"), Indicator_1 = c(1L, 
0L, 1L, -1L)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 01 августа 2020

1) Сделайте пример df

  set.seed(42) # the answer to the universe
  df <- data.frame(
  Name = rep(letters[1:20], 5),
  Indicator_1 = sample(
    c(1, 0, -1, NA),
    size = 100,
    replace = TRUE,
    prob = c(.3, .3, .3, .1)
    )
  )
  nrow(df)
  #[1] 100

2) Очистите результаты NA

df_complete <- df[complete.cases(df), ]
nrow(df_complete)
#[1] 84

3) Дважды проверьте Indicator_1 is numeri c

df_complete$Indicator_1 <- as.numeric(df_complete$Indicator_1)
str(df_complete)
# 'data.frame' :    84 obs. of  2 variables:
# $ Name       : chr  "c" "d" "e" "f" ...
# $ Indicator_1: num  1 0 0 -1 0 1 0 0 -1 0 .

4) Выполните фильтр, который вы нам уже предоставили

df_filtered <- df_complete[df_complete$Indicator_1 <= 0, ]
nrow(df_filtered)
#[1] 56
head(df_filtered)
#    Name  Indicator_1
# 4     d           0
# 5     e           0
# 6     f          -1
# 7     g           0
# 9     i           0
# 10    j           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...