Фильтрация минимальных значений в нескольких столбцах в R - PullRequest
1 голос
/ 18 июня 2020

заранее извините, если этот ответ плохо отформатирован, я новичок в R и сообществе SO, приветствую конструктивную критику. У меня есть фрейм данных, который выглядит так, и я пытаюсь отфильтровать его, чтобы он содержал только минимальное количество «Машины» и «Дома» для каждого человека.

my_data = data.frame("Name" = c("Dora", "Dora", "John", "John", "Marie", "Marie"), 
"Cars" = c(2, 3, NA, NA, 4, 1), 
"Houses" = c(NA, NA, 4, 3, 2, NA))
#Name   Cars   Houses
#1  Dora    2     NA
#2  Dora    3     NA
#3  John   NA      4
#4  John   NA      3
#5 Marie    4     2
#6 Marie    1     NA

Я хочу получить что-то вроде этого (особенно обратите внимание, что строка Mar ie изменилась, но это нормально, если она также разделена на 2 отдельные строки):

#Name   Cars   Houses
#Dora    2     NA
#John   NA     3
#Marie   1     2

ИЛИ вот так:

#Name   Cars   Houses
#Dora    2     NA
#John   NA      3
#Marie   NA     2
#Marie    1     NA

На основе другие ответы, я пробовал

my_data %>%
group_by(Name) %>%
filter(Cars == min(Cars))
#Name   Cars    Houses
#Dora   2       NA
#Marie  1       NA

, но это приводит к тому, что строки John удаляются, прежде чем я смогу отфильтровать минимальное количество домов. Есть ли у кого-нибудь предложения, как к этому подойти? Заранее спасибо.

Ответы [ 2 ]

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

Мы можем использовать summarise, чтобы получить минимум каждого столбца для каждого имени:

my_data = data.frame("Name" = c("Dora", "Dora", "John", "John", "Marie", "Marie"), 
"Cars" = c(2, 3, NA, NA, 4, 1), 
"Houses" = c(NA, NA, 4, 3, 2, NA))

library(dplyr)
my_data %>% 
  group_by(Name) %>% 
  summarise(Cars = min(Cars, na.rm = TRUE),
            Houses = min(Houses, na.rm = TRUE))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 3 x 3
  Name   Cars Houses
  <chr> <dbl>  <dbl>
1 Dora      2    Inf
2 John    Inf      3
3 Marie     1      2
0 голосов
/ 18 июня 2020

Вот что вы можете сделать в базе R:

df <- data.frame("Name" = c("Dora", "Dora", "John", "John", "Marie", "Marie"), 
                     "Cars" = c(2, 3, NA, NA, 4, 1), 
                     "Houses" = c(NA, NA, 4, 3, 2, NA), stringsAsFactors = FALSE)

aggregate(df, list(df$Name), FUN = function(x) min(x, na.rm = TRUE))[,-1]

Вывод

   Name Cars Houses
1  Dora    2     Inf
2  John   Inf      3
3 Marie    1       2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...