Это очень специфический вопрос: у меня есть ряд наблюдений от нескольких субъектов в течение нескольких лет (только одно наблюдение в год). Я хочу выбрать только одно наблюдение для каждого человека (мне все равно, с какого года) таким образом, чтобы я получал одинаковое количество наблюдений в год и как можно более случайным.
Итак, начиная с df
, в котором 1 - это годы, есть наблюдение для этого человека, а 0 - годы, когда нет наблюдения для этого человека:
df <- data.frame(Ind = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"),
Year1 = c(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
Year2 = c(0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0),
Year3 = c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1),
Year4 = c(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1))
выглядит как

Я бы хотел закончить с чем-то вроде этого

РЕДАКТИРОВАТЬ: пытается применить предложенные решения (и не удается)
(1) ответ Эрча:
df <- as_tibble(df)
year.weights <- df %>%
gather(Year, Obs, -Ind) %>%
group_by(Year) %>%
summarize(wt = sum(Obs)) %>%
ungroup
df %>%
gather(Year, Obs, -Ind) %>%
filter(Obs == 1) %>%
left_join(year.weights, by = "Year") %>%
group_by(Ind) %>%
sample_n(1, weight = 1 / wt) %>%
select(-wt) %>%
spread(Year, Obs) %>%
ungroup
Это дает ошибку Error: 'by' can't contain join column 'Year' which is missing from RHS
, которая появляется на шаге left_join
. Я пытаюсь решить эту проблему, задав имя "Год" единственной переменной в RHS
.
names(year.weights) <- "Year"
Но теперь это дает новую ошибку: Error in left_join_impl(x, y, by_x, by_y, aux_x, aux_y, na_matches) : Can't join on 'Year' x 'Year' because of incompatible types (numeric / character)
, которая действительно имеет большой смысл, поскольку столбец Year в LHS содержит Year1, Year2, Year3 и т. Д., В то время как столбец Year в RHS содержит число 27.
Это так далеко, как я понял, потому что я не вижу, чего пытался достичь earch, но я верю, что с помощью этого n_sample и аргумента веса можно найти реальное решение, но я пока не могу его увидеть ,
(2) Ответ Майки:
Это работает хорошо (я не получаю ошибку, которую я получал раньше), но это не гарантирует, что я получу одинаковое (или подобное) число 1 для каждого столбца "Год".
Итак, если я запускаю код пару раз для тестирования, я получаю:
# first time
[,1] [,2] [,3] [,4]
[1,] 0 0 0 1
[2,] 1 0 0 0
[3,] 0 0 1 0
[4,] 0 1 0 0
[5,] 1 0 0 0
[6,] 0 0 1 0
[7,] 0 0 0 1
[8,] 0 1 0 0
[9,] 0 0 0 1
[10,] 0 0 0 1
[11,] 0 0 0 1
# second time
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 1 0 0 0
[3,] 0 0 1 0
[4,] 0 1 0 0
[5,] 0 0 0 1
[6,] 1 0 0 0
[7,] 1 0 0 0
[8,] 0 0 0 1
[9,] 0 0 0 1
[10,] 0 0 0 1
[11,] 0 0 1 0
(3) Ответ Андре Элрико:
У него та же проблема, что и у ответа (2), он не гарантирует равное число 1 для каждого года: см. Два случайных вывода:
# fist try
Ind Year1 Year2 Year3 Year4
1 a NA NA NA 1
2 b NA NA 1 NA
3 c NA NA 1 NA
4 d NA 1 NA NA
5 e 1 NA NA NA
6 f NA NA 1 NA
7 g 1 NA NA NA
8 h NA NA NA 1
9 i NA NA NA 1
10 j NA NA NA 1
11 k NA NA 1 NA
# second try
Ind Year1 Year2 Year3 Year4
1 a 1 NA NA NA
2 b 1 NA NA NA
3 c NA NA 1 NA
4 d NA NA 1 NA
5 e NA 1 NA NA
6 f NA NA NA 1
7 g NA NA NA 1
8 h NA NA NA 1
9 i NA NA NA 1
10 j NA 1 NA NA
11 k NA NA 1 NA
(4) Ответ Паолоусеби имеет ту же проблему, что и предыдущие. Не гарантирует одинаковое количество выбранных 1 с в строке:
# first try
Ind Year1 Year2 Year3 Year4
1 a 1 NA NA NA
2 b NA NA NA 0
3 c NA NA 1 NA
4 d NA NA NA 0
5 e NA NA 1 NA
6 f NA NA NA 1
7 g 1 NA NA NA
8 h NA NA 0 NA
9 i NA NA NA 1
10 j NA NA NA 1
11 k NA NA 1 NA
# second try
Ind Year1 Year2 Year3 Year4
1 a NA NA NA 1
2 b NA 0 NA NA
3 c NA 1 NA NA
4 d NA NA NA 0
5 e NA NA NA 1
6 f NA 0 NA NA
7 g NA 0 NA NA
8 h NA NA 0 NA
9 i NA NA 0 NA
10 j NA NA 0 NA
11 k NA 0 NA NA