Агрегировать в R со столбцом даты, но по столбцу идентификатора

Я хочу aggregate (=обобщить) свои данные в соответствии с переменной id. Тем не менее, столбец даты после этого получает только NA, я думаю, потому что он настроен как «Дата».

Я хотел бы сохранить даты, как они есть.

Данные (10 первых наблюдений):

          TUCASEID AGE MALE BLACK YEAR DATASET INTERVIEW_DAY INTERVIEW_DATE
1   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
2   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
3   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
4   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
5   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
6   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
7   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
8   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
9   2.00301e+13  60    1     1 2003    2003             5      03Jan2003
10  2.00301e+13  41    0     0 2003    2003             6      04Jan2003

Затем я резюмирую это с помощью агрегата:

timeuse_2003_mean <- aggregate(timeuse_2003[,c("AGE","MALE","BLACK","YEAR","DATASET","INTERVIEW_DAY","INTERVIEW_DATE")],
      by=list(timeuse_2003$TUCASEID),mean)

Здесь вывод:

  TUCASEID         AGE MALE BLACK YEAR DATASET INTERVIEW_DAY INTERVIEW_DATE
1   2.0030100e+13  60    1     1 2003    2003             5             NA
2   2.0030100e+13  41    0     0 2003    2003             6             NA
3   2.0030100e+13  26    0     0 2003    2003             6             NA
4   2.0030100e+13  36    0     1 2003    2003             4             NA
5   2.0030100e+13  51    1     0 2003    2003             4             NA
6   2.0030100e+13  32    0     0 2003    2003             4             NA
7   2.0030100e+13  44    0     0 2003    2003             1             NA
8   2.0030100e+13  21    0     0 2003    2003             2             NA
9   2.0030100e+13  33    0     0 2003    2003             6             NA
10  2.0030100e+13  39    0     1 2003    2003             4             NA

У меня есть предупреждающее сообщение, вероятно, потому, что дата отформатирована как "as.Date", но мне нужно, чтобы она была в этом формате, и чтобы они также «обобщались» по «совокупности».

Заранее спасибо.


person Econ_Spectre    schedule 18.01.2020    source источник


Ответы (2)


Это работало в 2 этапа:

Сначала я суммировал набор данных с суммами соответствующих переменных по идентификатору переменной TUCASEID:

timeuse_2003_sum <- aggregate(timeuse_2003[,c("CHILD_CARE_BASIC","CHILD_CARE_TEACH",
                                              "CHILD_CARE_PLAY", ,"OTHER")],
                              by=list(timeuse_2003$TUCASEID),sum_col)

timeuse_2003_sum$TUCASEID <- timeuse_2003_sum$Group.1

timeuse_2003_sum$Group.1 <- NULL

timeuse_2003_sum <- subset(timeuse_2003_sum, select=c(38,1:37))

Во-вторых, я суммировал набор данных со средними значениями соответствующих переменных. На этот раз я включил не только идентификатор TUCASEIDв качестве группы, по которой будет производиться суммирование, но и переменные даты INTERVIEW_DATE:

 timeuse_2003_mean <- aggregate(timeuse_2003[,c("TUCASEID","AGE","MALE","BLACK","MARRIED",
                                   by=list(timeuse_2003$TUCASEID, timeuse_2003$INTERVIEW_DATE),mean)

    timeuse_2003_mean$TUCASEID <- timeuse_2003_mean$Group.1

    timeuse_2003_mean$INTERVIEW_DATE <- timeuse_2003_mean$Group.2

    timeuse_2003_mean$Group.1 <- NULL

    timeuse_2003_mean$Group.2 <- NULL

В итоге я объединил два сводных датаста по идентификатору TUCASEID:

##################################################################
##     Appending Summary Statistics to single dataset again     ##
##################################################################

timeuse_2003_Summary <- merge(timeuse_2003_mean, timeuse_2003_sum, by = "TUCASEID", all.y = TRUE)
person Econ_Spectre    schedule 18.01.2020

Я думаю, что вам нужно противоположное тому, что вы пробовали. Пытаться :

aggregate(TUCASEID~., df, mean)

#  AGE MALE BLACK YEAR DATASET INTERVIEW_DAY INTERVIEW_DATE TUCASEID
#1  60    1     1 2003    2003             5      03Jan2003    2e+13
#2  41    0     0 2003    2003             6      04Jan2003    2e+13

данные

df <- structure(list(TUCASEID = c(2.00301e+13, 2.00301e+13, 2.00301e+13, 
2.00301e+13, 2.00301e+13, 2.00301e+13, 2.00301e+13, 2.00301e+13, 
2.00301e+13, 2.00301e+13), AGE = c(60L, 60L, 60L, 60L, 60L, 60L, 
60L, 60L, 60L, 41L), MALE = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 0L), BLACK = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L), YEAR = c(2003L, 
2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L
), DATASET = c(2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
2003L, 2003L, 2003L), INTERVIEW_DAY = c(5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 6L), INTERVIEW_DATE = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L), .Label = c("03Jan2003", "04Jan2003"), class = 
"factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
person Ronak Shah    schedule 18.01.2020
comment
много для этого. Это сработало. Единственная проблема, которая у меня есть сейчас, заключается в том, что я слишком упростил свои данные, чтобы публиковать их здесь. В наборе данных 103 переменных, и только 30 из них должны быть суммированы таким образом, включая те, которые я опубликовал. Итак, у меня следующие вопросы: 1) как изменить синтаксис, чтобы адаптировать его для моего случая? 2) что значит наоборот, почему я сделал наоборот? Извините за глупый вопрос. 3) Можно ли суммировать данные с разными функциями (среднее и сумма), каждая для разных переменных одновременно? Большое спасибо за ваши усилия. - person Econ_Spectre; 18.01.2020
comment
@Econ_Spectre 1) Если у вас есть несколько столбцов для суммирования, вы можете сделать aggregate(cbind(TUCASEID, col1, col2)~col3 + col4, df, mean) и добавить/удалить больше столбцов. 2) Под противоположным я имел в виду, я думаю, вы хотели взять mean из столбца TUCASEID, но в вашей попытке у вас был этот столбец в качестве аргумента by, который используется для группировки по определенному столбцу. 3) Если вы хотите применить разные функции к разным столбцам, я бы предложил использовать dplyr, что упрощает это. - person Ronak Shah; 18.01.2020
comment
Я понимаю. Спасибо. 1) в чем разница между TUCASEID~. и by TUCASEID? TUCASEID — это идентификатор обсерватории. Сравнивая это с исходным do.file Stata, который у меня есть, результаты кажутся очень похожими, хотя даты и другие переменные искажаются. 2) не знаете какая функция dplyr может это сделать или какая строчка подойдет для моего случая из двух функций? - person Econ_Spectre; 18.01.2020
comment
Я сбит с толку. Если TUCASEID является идентификатором, для какого столбца вы хотите вычислить mean? - person Ronak Shah; 18.01.2020
comment
На самом деле я пытаюсь воспроизвести код Stata в R. Код Stata говорит: collapse (mean) age male black............ (sum) child_care_basic................ .........., by(tucaseid); Если я правильно понимаю, TUCASEID, переменная ID, должна использоваться в качестве ссылки для сводки, которая состоит из mean и sum, в зависимости от переменная. Использование ссылки TUCASEIDas означает группировку по определенному столбцу? - person Econ_Spectre; 18.01.2020
comment
Используя dplyr, вы можете попробовать: df %>% group_by(TUCASEID) %>% mutate_at(vars(AGE, col1), mean) %>% mutate_at(vars(BLACK, col1), sum) так что включите все столбцы для обозначения в 1-м mutate_at, все столбцы для суммирования во втором mutate_at и так далее. - person Ronak Shah; 18.01.2020
comment
Я попробовал, но получил много предупреждений и новый набор данных с тем же количеством наблюдений, что и исходный, то есть 412 611 наблюдений. Он должен был быть уменьшен до 20 720. Раньше, когда я пытался сделать сводки с mean и sum отдельно с кодом в моем вопросе, а затем добавить оба, я получил ровно 20 720 наблюдений, но с большим количеством предупреждений, а столбец «NTERVIEW_DATE» превратился в NA. Я думаю, ваше первое предложение может быть правильным, хотя я получил 1635 наблюдений. вместо 20 720. Я не знаю. - person Econ_Spectre; 18.01.2020
comment
да, потому что, поскольку мы используем mutate, это не меняет количество строк. Итак, попробуйте df %>% group_by(TUCASEID) %>% mutate_at(vars(AGE, col1), mean) %>% mutate_at(vars(BLACK, col1), sum) %>% slice(1L), это должно уменьшить количество строк. - person Ronak Shah; 18.01.2020
comment
К сожалению, теперь у меня есть 20 720 наблюдений, но 103 переменных, а не 68, которые должны быть. Более того, даты снова сбились. Можем ли мы разработать решение R-Base, похожее на ваше первое, но в любом случае согласующееся с моей первой попыткой, как в вопросе. Как вы думаете, это возможно? Ваше первое предложение решило проблему с датой. Спасибо, что поделились своими знаниями и ценным временем. - person Econ_Spectre; 18.01.2020
comment
Думаю, я понял. Я просто установил столбец даты INTERVIEW_DATEв качестве второй группы timeuse_2003_mean <- aggregate(timeuse_2003[,c("TUCASEID","AGE","MALE","BLACK",..., by=list(timeuse_2003$TUCASEID, timeuse_2003$INTERVIEW_DATE),mean) После этого я сделал то же самое для aggregate' with sum`. Затем я просто объединил два набора данных. Я смотрю на одно наблюдение, и все значения соответствуют исходному выводу в Stata, код которого у меня есть. Могу ли я быть наивным здесь или я могу доверять этим результатам? Спасибо. - person Econ_Spectre; 18.01.2020
comment
Замечательно. Да, использование базы R — разумный подход. Рад, что ты понял это. :) - person Ronak Shah; 18.01.2020
comment
Большое спасибо за ваше время и усилия, чтобы помочь новичку, как я. Выложу для другого. Не могли бы вы продвинуть его к ответу? с наилучшими пожеланиями, мой друг - person Econ_Spectre; 18.01.2020
comment
последний вопрос к вам, если я не злоупотребляю вашим терпением: одна единственная переменная стала детурпированной. Только один. У вас есть идеи, почему это может быть так? - person Econ_Spectre; 18.01.2020
comment
Не совсем уверен, может попробовать merge(timeuse_2003_mean, timeuse_2003_sum, by = "TUCASEID", all = TRUE). Проголосовал за ваш ответ. - person Ronak Shah; 18.01.2020