Как удалить НС с условиями в R? - PullRequest
3 голосов
/ 12 февраля 2020

Я хотел бы удалить несколько строк с условием. Вот мои данные:

df_A <- tribble(
  ~product_name,   ~id,  ~clicks,
        "A",        NA,      1,  
        "A",         4,      1, 
        "A",         3,      1, 
        "B",        NA,      NA, 
        "B",         6,      2, 
        "C",        NA,      3, 
        "C",         5,      NA, 
)

Например, я хочу удалить первую и шестую строки, потому что продукт A и C в product_name уже имеют значение в столбце id. Но я хочу сохранить четвертую строку, потому что это мое условие, что если все строки (кроме product_name) равны NA, они должны оставаться в данных.

А вот мои желаемые данные:

df_A <- tribble(
  ~product_name,   ~id,  ~clicks,
       "A",          4,      1, 
       "A",          3,      1, 
       "B",         NA,      NA, 
       "B",          6,      2, 
       "C",          5,      NA, 
)

Ответы [ 5 ]

3 голосов
/ 12 февраля 2020

вы можете создать фиктивный столбец с вашим условием и отфильтровать его

df_A %>%
  mutate(
    not_remove = case_when(
      is.na(id) & is.na(clicks) ~ TRUE,
      is.na(id) ~ FALSE,
      TRUE ~ TRUE
    )
  ) %>%
  filter(not_remove) %>%
  select(
    -not_remove
  )
1 голос
/ 12 февраля 2020

Поскольку у вас есть определенные c условия для фильтрации на NA, я использовал циклы if и for. Надеюсь, это поможет.

for(i in 1:nrow(df_A)){
  if(!is.na(df_A$product_name[i]) & is.na(df_A$id[i]) & is.na(df_A$clicks[i]))
    df_A[i,]<-df_A[i,]
  else if(is.na(df_A$id[i]))
    df_A<-df_A[-i,]
}  

Вывод: Вывод изображения

1 голос
/ 12 февраля 2020

Тогда это должен быть ответ:

df_A <- df_A[!((duplicated(df_A$product_name) | duplicated(df_A$product_name, fromLast=TRUE)) & is.na(df_A$id) & !is.na(df_A$clicks)),]
1 голос
/ 12 февраля 2020

Вот базовое решение R с использованием ave

df_A_out <- subset(df_A,!(!!ave(id,product_name,FUN = function(x) sum(!is.na(x))>0) & is.na(id) & !is.na(clicks)))
1 голос
/ 12 февраля 2020
df_A %>%
    group_by(product_name) %>%
    filter(!is.na(id) |
               is.na(id) & is.na(clicks))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...