Как удалить определенное условие из фрейма данных - PullRequest
2 голосов
/ 17 июня 2020

Допустим, это мой df:

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)

И я хотел бы удалить всех людей, которые никогда не выполняли никаких действий.

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

nevercompleted<- df %>% 
  filter(completion != 0) %>% 
  group_by(people) %>% 
  summarise("frequency activity" = n())

df<- -c (df$nevercompleted)

Итак, в этом сценарии человек 4 должен быть удален из df. Обратите внимание, что меня интересует удаление только тех, которые никогда не завершали ничего , например человека 4, а не человека 1, который в какой-то момент завершает действие.

Ответы [ 4 ]

2 голосов
/ 17 июня 2020

1. База R

В базе R следующее можно легко переписать как однострочное:

i <- ave(as.logical(df$completion), df$people, FUN = function(x) any(x != 0, na.rm = TRUE))
df <- df[which(i), ]
df
#   people activity completion
#1       1        1          0
#2       1        1          0
#3       1        1          1
#4       2        2          0
#5       2        2          1
#6       3        3          1
#7       3        4          1
#10      5        6          0
#11      5        6          1

2. Пакет dplyr

И вот способ dplyr.

Сначала отфильтруйте только людей, которые выполнили действие, затем присоединитесь к исходному набору данных, чтобы получить все столбцы.

df <- df %>%
  group_by(people) %>%
  summarise(completion = any(as.logical(completion))) %>%
  filter(completion) %>%
  select(-completion) %>%
  left_join(df, by = 'people')

df
#`summarise()` ungrouping output (override with `.groups` argument)
## A tibble: 9 x 3
#  people activity completion
#   <dbl>    <dbl>      <dbl>
#1      1        1          0
#2      1        1          0
#3      1        1          1
#4      2        2          0
#5      2        2          1
#6      3        3          1
#7      3        4          1
#8      5        6          0
#9      5        6          1

Data

В вопросе нет инструкции data.frame, только создание векторов столбцов.

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)
df <- data.frame(people, activity, completion)
2 голосов
/ 17 июня 2020

в Базе мы могли бы это сделать

    byGroup <- split(df,df$people)
    do.call(rbind,byGroup[sapply(byGroup, function(x) !all(x$completion == 0))])

      people activity completion
1.1       1        1          0
1.2       1        1          0
1.3       1        1          1
2.4       2        2          0
2.5       2        2          1
3.6       3        3          1
3.7       3        4          1
5.10      5        6          0
5.11      5        6          1
0 голосов
/ 17 июня 2020

можно сделать так

library(tidyverse)
df <- tibble(people, activity, completion)

df %>% 
  group_by(people) %>% 
  filter(any(completion != 0))

# A tibble: 9 x 3
# Groups:   people [4]
  people activity completion
   <dbl>    <dbl>      <dbl>
1      1        1          0
2      1        1          0
3      1        1          1
4      2        2          0
5      2        2          1
6      3        3          1
7      3        4          1
8      5        6          0
9      5        6          1
0 голосов
/ 17 июня 2020

Вот код, который должен работать:

library(dplyr)

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)

df <- data.frame(people, activity, completion)

df <- filter(df, completion != 0)

Результат:

  people activity completion
1      1        1          1
2      2        2          1
3      3        3          1
4      3        4          1
5      5        6          1

Это отфильтрует ваш фрейм данных по строкам, переменная completion которых не равна 0.

Я не уверен, куда вы собирались с group_by и summarize. Если вы хотите сделать больше, чем просто удалить строки, переменная completion которых равна 0, уточните это в своем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...