Разделить два столбца, обозначенных точками с запятой, на строки (R)

#r #tidyr

#r #tidyr

Вопрос:

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

Я хотел бы превратить их в несколько строк, при этом новые строки будут сопоставлены на основе порядка в исходных строках.

Если бы у меня был только один столбец, я бы использовал separate_rows , но я не знаю, как это сделать с двумя столбцами, которые нужно сопоставить. Это проще объяснить на примере:

Воспроизводимый пример:

 AU <- c("Ali, PB; Naylor, JC", "Warren, EW; Stephens, D")
EM <- c("PatAllen@fake.com; JNaylor@fake.edu","LizWarren@fake.edu.au; Doug@fake.net")
question <- data.frame(AU, EM)
  

Я бы хотел, чтобы фрейм данных был таким:

 1 Ali, PB PatAllen@fake.com
2 Naylor, JC JNaylor@fke.edu
3 Warren, EW LizWarren@fake.edu.au
4 Stephens, D Doug@fake.net
  

Комментарии:

1. Вы можете использовать : splitstackshape::cSplit(question, c('AU', 'EM'), sep = ';', direction = "long")

Ответ №1:

tidyr пакет на помощь! separate_rows() это новая (?) функция, которая делает именно то, что вы хотите.

 tidyr::separate_rows(question, AU, EM, sep = ";", convert = T)
  

Комментарии:

1. А, понятно: я не осознавал, что separate_rows достаточно гибко работает с двумя столбцами. Принятый ответ 🙂

Ответ №2:

Если вы не хотите использовать формулу pretty tidyverse от Ben, и в случае, если ваши данные всегда совпадают с именем и электронной почтой по одной и той же позиции, вы могли бы сделать это также с помощью цикла for

 AU <- c("Ali, PB; Naylor, JC", "Warren, EW; Stephens, D")
EM <- c("PatAllen@fake.com; JNaylor@fake.edu","LizWarren@fake.edu.au; Doug@fake.net")
question <- data.frame(AU, EM, stringsAsFactors = FALSE)

df <- data.frame(name=c(), email=c())
for(r in 1:nrow(question)){
  a <- strsplit(question[r,1], "; ")[[1]]
  e <- strsplit(question[r,2], "; ")[[1]]
  
  df <- rbind(df, data.frame(name=a, email=e))
}
df
  

или даже векторизируйте его, если вам нужно ускорить работу:

 x <- apply(question, 2, strsplit, "; ")
matrix(unlist(x), ncol=2)
  

Кроме того, следите за разделением на «; «, а не «;», потому что вторая часть каждой ячейки в ваших данных начинается символом пробела