Как реструктурировать фрейм данных из значения одного столбца в повторяющиеся строки столбцов - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь изменить формат моего фрейма данных на основе значений данных одного столбца, чтобы представить повторяющиеся последовательности другого. Мой набор данных состоит из имени файла, количества наблюдений, даты и идентификации видов. Имея набор данных, как он есть (см. Ниже), мне удается только построить значения, для которых n> 0, но я бы хотел, чтобы у нулей был обзор пропорций без потери количества наблюдений.

Я пробовал использовать функцию tidyr :: spread, но я не хочу создавать новые столбцы на основе значений этого единственного столбца. Я хочу, чтобы другие столбцы (например, file.name, Date, ID) повторялись на основе значений первого (n). tidyr :: melt, похоже, тоже мне не подходит ...

Вот пример:

call_obs <- data.frame("file.name" = c("pa0095au_001_180315_192129.wav", "pa0095au_002_180315_193134.wav", "pa0095au_003_180315_194133.wav", "pa0097au_002_180316_004647.wav", "pa0097au_003_180316_005646.wav"), "ID" = c("HW","None", "None", "HW", "HW"), "n" = c(1,0,0,3,2),"Date" = c('2018-03-15','2018-03-15','2018-03-15', '2018-03-16', '2018-03-16')) 

Я бы хотел что-то вроде

data.frame("file.name" = c("pa0095au_001_180315_192129.wav", "pa0095au_002_180315_193134.wav", pa0095au_003_180315_194133.wav", "pa0097au_002_180316_004647.wav", "pa0097au_002_180316_004647.wav", "pa0097au_002_180316_004647.wav", "pa0097au_003_180316_005646.wav", "pa0097au_003_180316_005646.wav"), "ID" = c("HW","None", "None", "HW", "HW", "HW", "HW", "HW"), "n" = c(1,0,0,1,1,1,1,1), "Date" = c('2018-03-15','2018-03-15','2018-03-15', '2018-03-16', '2018-03-16', '2018-03-16', '2018-03-16', '2018-03-16'))

Дата как Дата, file.name как символ, ID как фактор, n как цифра

Любая помощь будет отличной.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Используя tidyr и dplyr вы можете сделать:

library(tidyr)
library(dplyr)

call_obs %>%
uncount(., if_else(n == 0, n +1, n)) %>%
mutate(n = if_else(n > 0, 1, 0))


#                      file.name   ID n       Date
#1 pa0095au_001_180315_192129.wav   HW 1 2018-03-15
#2 pa0095au_002_180315_193134.wav None 0 2018-03-15
#3 pa0095au_003_180315_194133.wav None 0 2018-03-15
#4 pa0097au_002_180316_004647.wav   HW 1 2018-03-16
#5 pa0097au_002_180316_004647.wav   HW 1 2018-03-16
#6 pa0097au_002_180316_004647.wav   HW 1 2018-03-16
#7 pa0097au_003_180316_005646.wav   HW 1 2018-03-16
#8 pa0097au_003_180316_005646.wav   HW 1 2018-03-16
0 голосов
/ 04 ноября 2019

Вот один способ в базе R с использованием rep в строках:

call_obs <- call_obs[rep(seq(nrow(call_obs)), ifelse(call_obs$n == 0, 1, call_obs$n)),]
call_obs$n <- as.numeric(call_obs$n > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...