R pivot_longer объединяет несколько столбцов - PullRequest
1 голос
/ 30 мая 2020

У меня есть фрейм данных, в котором несколько столбцов содержат аналогичную информацию, которую я бы хотел свернуть на меньшее количество столбцов. Это выглядело немного отличным от обычного использования pivot_long или gather, и я застрял. Моя первая мысль заключалась в том, чтобы сделать 3 отдельных набора и привязку строк ... но я думаю, что у кого-то здесь будет более элегантное решение!

df<-data.frame("PicID"=letters[1:8],
"Near_Species1" = c("bird","bird", "bird", "dog", "dog", "human", "none", "human"),
"Count1" = c(1,1,1,1,2,1,0,1),
"Near_Species2" = c(NA,"human", NA, NA, "human", NA, NA, NA), 
"Count2" = c(NA,1, NA, NA, 1, NA, NA, NA),
"Far_Species"=c(NA, NA, NA,NA, NA, NA, NA, "bird"))

Я бы хотел изменить это подольше с помощью basi c структура

PicID   NearorFar   Species   Count

Я хотел бы иметь хотя бы 1 строку на изображение на основе Near_Species1, независимо от того, что там есть (нет, NA, et c).

И если в Near_Species2, Count2 ИЛИ Far_Species есть другие виды, кроме "none", я бы хотел еще одну строку. По сути, «нет» для видов - это NA. Но я бы хотел, чтобы хотя бы одна строка отслеживала этот идентификатор.

вывод будет выглядеть так, но удалите строки, в которых разновидность является NA.

df_out <- data.frame(
  "PicID" = c("a", "b", "c", "d", "e", "f", "g", "h", 
          "a", "b", "c", "d", "e", "f", "g", "h", 
          "a", "b", "c", "d", "e", "f", "g", "h"),
"NearorFar"=rep(c("Near", "Far"),times=c(16, 8)),
"Species"= paste(c("bird","bird", "bird", "dog", "dog", "human", "none", "human", 
                NA,"human", NA, NA, "human", NA, NA, NA, 
                NA, NA, NA,NA, NA, NA, NA, "bird")),
"Count"= c(1,1,1,1,2,1,0,1,
          NA,1, NA, NA, 1, NA, NA, NA, 
          rep(NA, 8))
)

1 Ответ

2 голосов
/ 30 мая 2020

Мы можем использовать pivot_longer

library(dplyr)
library(tidyr)
library(stringr)
df %>% 
  pivot_longer(cols = matches('Species'), names_to = 'NearorFar', 
         values_to = 'Species') %>% 
  mutate(NearorFar = str_remove(NearorFar, "_.*")) %>% 
  pivot_longer(cols = starts_with('Count'), names_to = NULL, 
          values_to = 'Count', values_drop_na = TRUE) %>% 
  distinct 
...