У меня есть несколько наблюдений на человека (данные панели). Но на самом деле для определенного вида сюжета мне нужен только один ряд на человека, и у меня есть несколько характеристик, которые не меняются вообще.
Вот данные и базовый анализ:
set.seed(1234)
data = data.frame(id=rep(1:25, each=4), time=seq(1:4),
char1 = sample(0:10, 100, replace=T),
char2 = sample(0:5, 100, replace=T),
yob = rep(sample(1910:2010, 25, replace=T), each=4))
data <- data %>%
group_by(yob) %>% # year of birth
mutate(char1_share = sum(char1==1)/sum(char1)) %>% # first characteristic
mutate(char2_share = sum(char2==1)/sum(char2)) # second characteristic
ggplot(data = data, aes(x = yob)) +
geom_smooth(aes(y=char1_share, color="char1")) +
geom_smooth(aes(y=char2_share, color="char2"))
Когда я использую все свои 100 наблюдений, я неправильно прогнозируюэти отношения, так как человек учитывается несколько раз (мои реальные данные содержат случайное количество строк, например, от 1 до 5 раз). Я знаю, как получить доступ к числу уникальных людей:
data %>% distinct(id)
, но я не могу объединить это с моей структурой группового изменения.
Данные должны быть свернуты следующим образом:
head(data, n=8L)
# A tibble: 8 x 7
# Groups: yob [2]
id time char1 char2 yob char1_share char2_share
<int> <int> <int> <int> <int> <dbl> <dbl>
1 1 1 9 2 1942 0.0222 0.05
2 1 2 5 3 1942 0.0222 0.05
3 1 3 4 3 1942 0.0222 0.05
4 1 4 8 2 1942 0.0222 0.05
5 2 1 4 1 1970 0.0769 0.143
6 2 2 5 3 1970 0.0769 0.143
7 2 3 3 4 1970 0.0769 0.143
8 2 4 1 1 1970 0.0769 0.143
- Сожмите всю информацию, которая не меняется на человека, например,
id
, yob
, и доли (char1_share
, char2_share
). Они не меняются. - Забудьте о некоторых других столбцах, которые не важны для этого конкретного анализа. Это
time
. Я могу сделать это, набрав select
в dplyr. - Выберите самое высокое значение, когда-либо достигнутое для человека. Так что
char1
и char2
имеют разные измерения. Для человека 1 он должен быть равен 9, для человека два - 4 и так далее.
Я ожидаю следующий тибл:
# A tibble: 8 x 7
# Groups: yob [2]
id char1 char2 yob char1_share char2_share
<int> <int> <int> <int> <dbl> <dbl>
1 1 9 3 1942 0.0222 0.05
7 2 5 4 1970 0.0769 0.143
Спасибо.
Обновление: Идеи Я пробовал несколько версий top_n
и slice
. Это всегда довольно близко, например:
data %>%
select(-time) %>%
group_by(id) %>%
slice(which.max(char1))
В этой версии мне нужно расширить slice(which.max(char1))
char1 до "столбец за столбцом".