Разбить переменную в каждой строке, чтобы сформировать два новых столбца в data.frame - PullRequest
0 голосов
/ 19 декабря 2018

После очистки файла PDF у меня есть фрейм данных с текстом chr var:

df = data.frame(text = c("abc","def","abc","def"))

Мой вопрос заключается в том, как преобразовать его в:

df = data.frame(text1 = c("abc","abc"),text2=c("def","def"))

Я могуиндексировать строки и вручную перестраивать новый df, но было любопытно, можно ли это сделать в dplyr трубе.

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

Ответы [ 2 ]

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

Используя dplyr, вы можете создать новый столбец (ind) для группировки, который будет иметь одинаковые значения через каждые чередующиеся строки, а затем мы group_by ind и создадим столбец последовательности (id) до spread данные в два столбца.

library(dplyr)
library(tidyr)

df %>%
  mutate(ind = rep(c(1, 2),length.out = n())) %>%
  group_by(ind) %>%
  mutate(id = row_number()) %>%
  spread(ind, text) %>%
  select(-id)


#   `1`   `2`  
#  <fct> <fct>
#1 abc   def  
#2 abc   def  

Базовая опция R будет split df в отдельном кадре данных через каждые чередующиеся строки, создавая последовательность, используя rep и cbind ихвместе, чтобы сформировать 2-колоночный фрейм данных.

do.call("cbind", split(df, rep(c(1, 2), length.out = nrow(df))))

#  text text
#1  abc  def
#3  abc  def
0 голосов
/ 19 декабря 2018

Мы могли бы сделать это за base R.Используйте маршрут matrix, чтобы переставить вектор / столбец в matrix, а затем преобразовать его в data.frame (as.data.frame).Поскольку число столбцов является постоянным, т. Е. 2, укажите это значение в ncol

as.data.frame(matrix(df$text, ncol = 2, byrow = TRUE, 
      dimnames = list(NULL, c('text1', 'text2'))))
#   text1 text2
#1   abc   def
#2   abc   def

Или другой параметр - unstack из base R после создания последовательности альтернативных идентификаторов (используяпереработка)

unstack(transform(df, val = paste0('text', 1:2)), text ~ val)
#    text1 text2
#1   abc   def
#2   abc   def

Или мы можем split в list из vector с, а затем cbind это вместе

as.data.frame(do.call(cbind, split(as.character(df$text), 1:2)))
#   1   2
#1 abc def
#2 abc def

Или другой вариант - dcast из data.table

library(data.table)
dcast(setDT(df), rowid(text)~ text)[, text := NULL][]

data

df <- data.frame(text = c("abc","def","abc","def"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...