2016-10-03 7 views
0

Я работаю с некоторыми данными опроса (собранными и зарегистрированными кем-то другим), которые находятся в странном формате. Он регистрирует обилие видов на обзорных разрезах, но в нем перечислены только виды, наблюдаемые в течение данного разреза, и не все зарегистрированные виды. Я потратил некоторое время на выяснение того, как переформатировать данные с использованием tidyr, чтобы у меня были столбцы для каждого вида во время каждого опроса, а виды, не зарегистрированные, заполнены 0. Вот короткий, воспроизводимый пример:Суммирование строк с повторяющимися идентификаторами в tidyr :: spread

#This works: 
Survey <- as.factor(c(rep("Survey 1",10),rep("Survey 2",10),rep("Survey 3",10))) 
Species <- as.factor(c(c("A","B","C","D","E","U","V","W","X","Y"),c("A","C","E","G","I","K","M","O","Q","S"),c("B","D","F","H","J","L","N","P","R","T"))) 
Abundance <- ceiling(runif(30,1,50)) 

working.df<-cbind.data.frame(Survey,Species,Abundance) 

working.spread<-working.df %>% 
    group_by(Survey) %>% 
    spread(Species,Abundance,drop=F,fill=0) 

К сожалению, настоящие данные не так просты. В некоторых случаях они регистрировали несколько строк одного и того же вида в рамках одного обследования, чтобы они могли записывать информацию о дополнительной переменной, которой меня не интересует. Мне просто интересно об общем количестве случаев в опросе. Так что это пример того, что реальные данные могут выглядеть (обратите внимание на двойную «А» в начале Species2):

#This doesn't work:  
Species2 <- as.factor(c(c("A","A","C","D","E","U","V","W","X","Y"),c("A","C","E","G","I","K","M","O","Q","S"),c("B","D","F","H","J","L","N","P","R","T"))) 

not.working.df<-cbind.data.frame(Survey,Species2,Abundance) 

not.working.spread<-not.working.df %>% 
    group_by(Survey) %>% 
    spread(Species2,Abundance,drop=F,fill=0) 

Итак, когда не два из одного вида в списке, распространение аргументов нет больше работы, и возвращает привычную ошибку:

Error: Duplicate identifiers for rows (1, 2) 

и в подлинном наборе данных я получаю сообщение об ошибке с очень немногим из этих дублей (и это только один из нескольких наборов данных), так что я не хочу пройдите и исправьте это вручную, конечно:

Error: Duplicate identifiers for rows (206, 216), (1532, 1544), (1052, 1595), (1324, 1330), (191, 212), (194, 211), (1392, 1600), (19, 37), (1404, 1599), (199, 215), (1073, 1596), (1074, 1597), (43, 44, 45), (455, 456), (380, 381, 382, 383), (447, 448), (413, 414, 415, 416, 417, 418), (303, 304), (1015, 1016), (897, 898, 1593), (1306, 1307), (1041, 1594), (1076, 1598), (1425, 1426), (49, 64), (198, 214) 

То, что я хотел бы сделать, это суммировать поле Abundance по повторяющимся идентификаторам. Я знаю, что здесь есть похожие вопросы, и я позаботился о многих из них, но пока не нашел решения. Я много работал над тем, чтобы дойти до этого момента с распространением, и кажется, что я одна простая функция, чтобы заставить это работать ... любые советы были бы очень оценены. Или, если я полностью пропустил существующий ответ на эту проблему, укажите мне в этом направлении.

Приветствия

+0

Похоже, вам нужно суммировать набор данных перед распространением. [Этот ответ] (http://stackoverflow.com/a/35228491/2461552) как приятное объяснение процесса. – aosmith

+0

Спасибо, что сделал! Решение ниже ... – stewart6

ответ

1

Спасибо, aosmith, указал мне в направлении подвести итог нити-что сделал трюк. Вот рабочее решение:

not.working.spread<-not.working.df %>% 
    group_by(Survey,Species2) %>% 
    summarize(Abundance = sum(Abundance)) %>% 
    spread(Species2,Abundance,drop=F,fill=0)