Произвольно выбирайте наблюдения внутри группы, используя функцию dplyr / base R - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть такие данные:

student.id <- c("142", "142", "567", "567", "347", "347", "567", "945")
flag.double <- c("1", "1", "1", "1", "1", "1", "0", "0")
data <- data.frame(student.id, flag.double)

Я хочу сгруппировать по student.id, отфильтровать по учащимся, у которых есть flag.double==1, и случайным образом выбрать одно наблюдение за учеником (из двух доступных случаев). студентов). Затем я хочу объединить это обратно в данные.

Это дает мне случайные наблюдения, которые я хочу:

flag <- data %>% 
  group_by(student.id) %>% 
  filter(flag.double==1) %>% 
  sample_n(flag.double, replace = T)

Но теперь мне нужно объединить это обратно в исходный фрейм данных, чтобы у меня был столбец, отмечающий эти наблюдения, которые быливыбран случайно.

Далее я просто присоединился к этому набору данных.

data <- left_join(data, flag)

Все работает хорошо, но я ненавижу, как неэффективно все это выглядит. Мне также не нравится создавать новый фрейм данных, чтобы просто присоединить его к исходному. Есть ли более элегантный способ сделать это dplyr, tidyr, plyr, pipe?

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Если я правильно понимаю, что вы хотите выбрать одно наблюдение из дублированных student.id с, вы можете сгенерировать дополнительный столбец с указанием этой процедуры выборки:

set.seed(123)
library(dplyr)
data.frame(
    student.id = c("142", "142", "567","567","347","347", "567", "945"),
    flag.double = c("1","1","1", "1","1", "1","0", "0"),
    x = rnorm(8) # other data for expository purposes
  ) %>%
  group_by(student.id) %>%
  mutate(in_sample = ifelse(flag.double == 1, sample(0:1), NA))
#> # A tibble: 8 x 4
#> # Groups:   student.id [4]
#>   student.id flag.double       x in_sample
#>   <fct>      <fct>         <dbl>     <int>
#> 1 142        1           -0.560          1
#> 2 142        1           -0.230          0
#> 3 567        1            1.56           0
#> 4 567        1            0.0705         1
#> 5 347        1            0.129          0
#> 6 347        1            1.72           1
#> 7 567        0            0.461         NA
#> 8 945        0           -1.27          NA

Созданона 2019-11-20 пакетом представьте (v0.3.0)

0 голосов
/ 21 ноября 2019

Если вам просто нужно взять один столбец, а есть только два столбца, то сработает следующее:

data %>% distinct(student.id,flag.double)

Если у вас есть другой столбец значений, и можно выбрать первый:

data$row <- 1:nrow(data)
data[!duplicated(data[,c("student.id","flag.double")]),]

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

data %>% group_by(student.id,flag.double) %>% sample_n(1)

Предполагая, что ваш flag.double правильный, это работает, потому что те, у которых 0 в качестве flag.double, должны быть уникальными дляЯ бы. Следовательно, вы можете просто сгруппировать по обеим переменным, а затем сэмплировать

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