Как сжать несколько наблюдений на человека в одном ряду с помощью dplyr? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть несколько наблюдений на человека (данные панели). Но на самом деле для определенного вида сюжета мне нужен только один ряд на человека, и у меня есть несколько характеристик, которые не меняются вообще.

Вот данные и базовый анализ:

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"))

enter image description here

Когда я использую все свои 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 до "столбец за столбцом".

Ответы [ 2 ]

1 голос
/ 23 октября 2019
data %>% 
  group_by(id) %>% 
  summarise(
    char1 = max(char1),
    char2 = max(char2),
    yob   = yob[[1]],
    char1_share = char1_share[[1]],
    char2_share = char2_share[[1]]
  )

Или, если он работает достаточно быстро на ваших данных, вы можете просто использовать

data %>% 
  group_by(id) %>% 
  summarise_all(max)
1 голос
/ 23 октября 2019

Это можно сделать с помощью других group_by и summarize после создания двух переменных общего ресурса.

data2 <- data %>% 
  group_by(id, yob, char1_share, char2_share) %>%
  summarize(char1 = max(char1),
            char2 = max(char2))

Выход:

head(data2, n = 2)
# A tibble: 2 x 6
# Groups:   id, yob, char1_share [2]
     id   yob char1_share char2_share char1 char2
  <int> <int>       <dbl>       <dbl> <int> <int>
1     1  1942      0.0222       0.05      9     3
2     2  1970      0.0769       0.143     5     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...