R Новые столбцы, основанные на наличии или отсутствии результатов в других столбцах - PullRequest
0 голосов
/ 19 декабря 2018

Я скрестил пальцы, чтобы один (или более) из вас, замечательные люди, смогли помочь ...

Например, скажем, у меня есть следующий df в R.

ID <- as.factor (c(1:6))
Pop <- as.factor(c(1,0,1,0,0,0))
Jazz <- as.factor(c(1,0,0,1,1,0))
Classical <- as.factor(c(0,0,1,0,0,0))
Rap <- as.factor(c(1,1,1,0,1,0))
   df <- data.frame(ID, Pop, Jazz, Classical, Rap)

Я бы хотел создать следующее ...

ID <- as.factor (c(1:6))
Pop <- as.factor(c(1,0,1,0,0,0))
Jazz <- as.factor(c(1,0,0,1,1,0))
Classical <- as.factor(c(0,0,1,0,0,0))
Rap <- as.factor(c(1,1,1,0,1,0))
Music_1 <- c("Pop","Rap","Pop","Jazz","Jazz",NA)
Music_2 <- c("Jazz",NA,"Classical",NA,"Rap",NA)
Music_3 <- c("Rap",NA,"Rap",NA,NA,NA)
    df2 <- data.frame(ID, Pop, Jazz, Classical, Rap, Music_1, Music_2, Music_3)

, где каждый идентификатор проверяется на предмет их музыкальных предпочтений, а затем эти варианты (с использованием заголовков из соответствующих столбцов) печатаются в новых столбцах.с непрерывными пронумерованными заголовками (например, Music_1, Music_2, Music_3 ...).

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

Пожалуйста, дайте мне знать, если это неясно.Заранее спасибо.

1 Ответ

0 голосов
/ 19 декабря 2018

Мы делаем формат от gather до 'long', filter из строк, где 'val' равно 0, сгруппированы по 'ID', создаем столбец последовательности ('ind'), spread это до«широкий» формат и затем объединение с исходными данными по «идентификатору» (даже без указания его, по умолчанию он выбирает общий столбец для объединения)

library(tidyverse)
df %>% 
  gather(key, val, -ID) %>% 
  filter(val == 1) %>% 
  select(-val) %>%
  group_by(ID) %>% 
  mutate(ind = paste0("Music", row_number())) %>% 
  spread(ind, key) %>% 
  right_join(df) %>%
  select(names(df), everything())
# A tibble: 6 x 8
# Groups:   ID [6]
#  ID    Pop   Jazz  Classical Rap   Music1 Music2    Music3
#  <fct> <fct> <fct> <fct>     <fct> <chr>  <chr>     <chr> 
#1 1     1     1     0         1     Pop    Jazz      Rap   
#2 2     0     0     0         1     Rap    <NA>      <NA>  
#3 3     1     0     1         1     Pop    Classical Rap   
#4 4     0     1     0         0     Jazz   <NA>      <NA>  
#5 5     0     1     0         1     Jazz   Rap       <NA>  
#6 6     0     0     0         0     <NA>   <NA>      <NA>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...