Как заменить повторяющиеся вопросы / значения подряд - PullRequest
2 голосов
/ 27 сентября 2019

Я собираюсь распространить таблицу, однако я столкнулся с проблемой с моими данными.Данные основаны на вопроснике, и вопросы находятся в 1 столбце, а ответы - в следующем столбце.Этот файл данных содержит около 20000 анкет, все они вставлены друг под другом.

Это выглядит так:

*Participant*   |      *Question*      |        *Answer* 
Paul            |    Age               |         15
Paul            |    City              |      Amsterdam
Paul            |    Pet_name          |       Butterfly
Paul            |    Fav_color         |       Pink
Paul            |    Parent_name       |       Hank
Paul            |    Parent_name       |       Mary
Adam            |    Age               |         78
Adam            |    City              |         LA
Adam            |    Pet_name          |       Crocodile
Adam            |    Fav_color         |       Purple
Adam            |    Parent_name       |       Pete
Adam            |    Parent_name       |       Peter

Проблема в том, что я не могу распространяться, когда два вопроса называются одинаковыми, в случае "Parent_name".

Поэтому желательно, чтобы второе вхождение Parent_name для каждого участника заменялось чем-то вроде Parent2_name или Parent_name2

. Я пытался идентифицировать дублирующиеся значения с помощью * 1010.* функция, однако, так как все вопросы повторяются, она просто помечает все, от второго участника, как дублированные

Чтобы воссоздать мои данные примера:

Participant <- c('Paul','Paul','Paul','Paul','Paul','Paul', 'Adam', 'Adam', 'Adam', 'Adam', 'Adam', 'Adam' )
Question <- c('Age', 'City', 'Pet_name', 'Fav_color', 'Parent_name', 'Parent_name', 'Age', 'City', 'Pet_name', 'Fav_color', 'Parent_name', 'Parent_name')
Answer <- c('15', 'Amsterdam', 'Butterfly', 'Pink', 'Hank', 'Mary', '78', 'LA', 'Crocodile', 'Purple', 'Pete', 'Peter')

df <- data.frame(Participant, Question, Answer)

Таким образом, конечный продукт будет выглядеть так:

*Participant*   |      *Question*      |        *Answer* 
Paul            |    Age               |         15
Paul            |    City              |      Amsterdam
Paul            |    Pet_name          |       Butterfly
Paul            |    Fav_color         |       Pink
Paul            |    Parent_name       |       Hank
Paul            |    Parent2_name      |       Mary
Adam            |    Age               |         78
Adam            |    City              |         LA
Adam            |    Pet_name          |       Crocodile
Adam            |    Fav_color         |       Purple
Adam            |    Parent_name       |       Pete
Adam            |    Parent2_name      |       Peter

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Выполнение этого с помощью data.table:

library(data.table)
Participant <- c('Paul','Paul','Paul','Paul','Paul','Paul', 'Adam', 'Adam', 'Adam', 'Adam', 'Adam', 'Adam' )
Question <- c('Age', 'City', 'Pet_name', 'Fav_color', 'Parent_name', 'Parent_name', 'Age', 'City', 'Pet_name', 'Fav_color', 'Parent_name', 'Parent_name')
Answer <- c('15', 'Amsterdam', 'Butterfly', 'Pink', 'Hank', 'Mary', '78', 'LA', 'Crocodile', 'Purple', 'Pete', 'Peter')

df <- data.table(Participant, Question, Answer)

Установите новый столбец с идентификатором участника и вопроса, затем присоедините его к исходному вопросу, где он больше двух, а затем удалите дополнительныйколонка.

df[, id := seq_len(.N), by = .(Participant, Question)]
df[id != 1, Question:= paste0(Question, id)]
df[, id := NULL]

Результат:

> df
    Participant     Question    Answer
 1:        Paul          Age        15
 2:        Paul         City Amsterdam
 3:        Paul     Pet_name Butterfly
 4:        Paul    Fav_color      Pink
 5:        Paul  Parent_name      Hank
 6:        Paul Parent_name2      Mary
 7:        Adam          Age        78
 8:        Adam         City        LA
 9:        Adam     Pet_name Crocodile
10:        Adam    Fav_color    Purple
11:        Adam  Parent_name      Pete
12:        Adam Parent_name2     Peter
1 голос
/ 27 сентября 2019

Мы можем group_by Participant и Question и добавить row_number() к Question, если имеется более одной строки.Это будет работать для любого Question с дублированными значениями.

library(dplyr)

df %>%
  group_by(Participant, Question) %>%
  mutate(Question1 = if (n() > 1) paste0(Question, row_number()) else Question) %>%
  ungroup %>%
  select(-Question)

#   Participant Answer    Question1   
#   <chr>       <chr>     <chr>       
# 1 Paul        15        Age         
# 2 Paul        Amsterdam City        
# 3 Paul        Butterfly Pet_name    
# 4 Paul        Pink      Fav_color   
# 5 Paul        Hank      Parent_name1
# 6 Paul        Mary      Parent_name2
# 7 Adam        78        Age         
# 8 Adam        LA        City        
# 9 Adam        Crocodile Pet_name    
#10 Adam        Purple    Fav_color   
#11 Adam        Pete      Parent_name1
#12 Adam        Peter     Parent_name2

данные

df <- data.frame(Participant, Question, Answer, stringsAsFactors = FALSE)
0 голосов
/ 27 сентября 2019

С dplyr:

library(dplyr)
df %>%
  group_by(Question) %>%
  mutate(Index = rank(Question, ties.method = "first")) %>%
  ungroup() %>%
  mutate(Question = paste(Question,Index, sep = "_")) %>%
  select(-Index) %>%
  spread(Question,Answer)

Используется ранжирование для последовательности переменных и должно работать независимо от количества дубликатов или их порядка.

...