#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)
Кроме того, следите за разделением на «; «, а не «;», потому что вторая часть каждой ячейки в ваших данных начинается символом пробела