Разделить столбец на разделителе в кадре данных

Я хотел бы разбить один столбец на два в рамках фрейма данных на основе разделителя. Например,

a|b b|c 

становиться

 ab bc 

в рамках кадра данных.

Благодаря!

@Taesung Shin – это правильно, но тогда еще немного волшебства, чтобы превратить его в data.frame . Я добавил строку «x | y», чтобы избежать двусмысленности:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) foo <- data.frame(do.call('rbind', strsplit(as.character(df$FOO),'|',fixed=TRUE))) 

Или, если вы хотите заменить столбцы в существующем файле data.frame:

 within(df, FOO<-data.frame(do.call('rbind', strsplit(as.character(FOO), '|', fixed=TRUE)))) 

Что производит:

  ID FOO.X1 FOO.X2 1 11 ab 2 12 bc 3 13 xy 

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

 require(reshape) > df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) > df ID FOO 1 11 a|b 2 12 b|c 3 13 x|y > df = transform(df, FOO = colsplit(FOO, split = "\\|", names = c('a', 'b'))) > df ID FOO.a FOO.b 1 11 ab 2 12 bc 3 13 xy 

Недавно популярный пакет tidyr делает это с separate . Он использует регулярные выражения, поэтому вам придется избегать |

 df <- data.frame(ID=11:13, FOO=c('a|b', 'b|c', 'x|y')) separate(data = df, col = FOO, into = c("left", "right"), sep = "\\|") ID left right 1 11 ab 2 12 bc 3 13 xy 

хотя в этом случае значения по умолчанию достаточно умны для работы (он ищет не буквенно-цифровые символы для разделения).

 separate(data = df, col = FOO, into = c("left", "right")) 

Просто наткнулся на этот вопрос, поскольку он был связан в недавнем вопросе о SO .

Бесстыдный штекер ответа: используйте cSplit из моего пакета splitstackshape:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) library(splitstackshape) cSplit(df, "FOO", "|") # ID FOO_1 FOO_2 # 1 11 ab # 2 12 bc # 3 13 xy 

Эта конкретная функция также обрабатывает разделение нескольких столбцов, даже если каждый столбец имеет разный разделитель:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'), BAR = c("A*B", "B*C", "C*D")) cSplit(df, c("FOO", "BAR"), c("|", "*")) # ID FOO_1 FOO_2 BAR_1 BAR_2 # 1 11 ab AB # 2 12 bc BC # 3 13 xy CD 

По сути, это удобная обертка для удобства использования read.table(text = some_character_vector, sep = some_sep) и привязка этого вывода к исходному data.frame . Другими словами, другой подход базы R R может быть:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) cbind(df, read.table(text = as.character(df$FOO), sep = "|")) ID FOO V1 V2 1 11 a|bab 2 12 b|cbc 3 13 x|yxy 
 strsplit(c('a|b','b|c'),'|',fixed=TRUE) 

Объединение ответов @Ramnath и @ Tommy позволило мне найти подход, который работает в базе R для одного или нескольких столбцов.

Основное использование:

 > df = data.frame( + id=1:3, foo=c('a|b','b|c','c|d'), + bar=c('p|q', 'r|s', 's|t'), stringsAsFactors=F) > transform(df, test=do.call(rbind, strsplit(foo, '|', fixed=TRUE)), stringsAsFactors=F) id foo bar test.1 test.2 1 1 a|bp|qab 2 2 b|cr|sbc 3 3 c|ds|tcd 

Несколько столбцов:

 > transform(df, lapply(list(foo,bar), + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar X1 X2 X1.1 X2.1 1 1 a|bp|qabpq 2 2 b|cr|sbcrs 3 3 c|ds|tcdst 

Лучшее именование нескольких разделенных столбцов:

 > transform(df, lapply({l<-list(foo,bar);names(l)=c('foo','bar');l}, + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar foo.1 foo.2 bar.1 bar.2 1 1 a|bp|qabpq 2 2 b|cr|sbcrs 3 3 c|ds|tcdst 
  • Collapse / concatenate / aggregate column для отдельной строки, разделенной запятой, в каждой группе
  • Должен ли я использовать data.frame или матрицу?
  • Как сделать паузу выполнения, спать, ждать X секунд в R?
  • Изменение имен столбцов фрейма данных
  • Объединение агрегированных значений обратно в исходный фрейм данных
  • Как добавить субтитры ggplot2 с разным размером и цветом?
  • Как объединить факторы, не превращая их в целые уровни?
  • Замена символьных значений NA в кадре данных
  • Импорт файлов Excel в R, xlsx или xls
  • Как установить пакет R из исходного кода?
  • Удаление html-тегов из строки в R
  • Давайте будем гением компьютера.