1

data.df

colA

2 AD
3 KF
4 GH

I want to split this column into two columns

 colA  ColB
  2     AD
  3     KF
  4     GH

Here's my code:

library(dplyr)

X1 <- data.df

ca <- as.data.frame(X1) %>% separate(X1,col=colA, into = paste("colA","colB"))

Error: Values not split into 1 pieces at 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64

What's wrong with my code?

Lucia
  • 615
  • 1
  • 9
  • 16

2 Answers2

2

When you pipe commands the first argument to each function will the data.frame, so try

library(tidyr)
dat %>% separate(colA, c("colA", "colB"))
#   colA colB
# 1    2   AD
# 2    3   KF
# 3    4   GH

Data

dat <- structure(list(colA = structure(1:3, .Label = c("2 AD", "3 KF", 
"4 GH"), class = "factor")), .Names = "colA", row.names = c(NA, 
-3L), class = "data.frame")
Rorschach
  • 31,301
  • 5
  • 78
  • 129
2

We could do this using read.table from base R. If the 'colA' in the initial dataset is factor class, convert to character, and use read.table. We can specify the column names with col.names argument.

read.table(text=as.character(dat$colA), sep='',
                      col.names=paste0('col', c('A', 'B')) )
#   colA colB
#1    2   AD
#2    3   KF
#3    4   GH

Another option is cSplit from splitstackshape. We specify the column to be split in the splitCols and the sep. The direction is 'wide' by default.

 library(splitstackshape)
 cSplit(dat, 'colA', ' ')

NOTE: "dat" from @nongkrong's post

akrun
  • 874,273
  • 37
  • 540
  • 662