-2

I have a data frame that look like

V1  V2    V3    V4   V5     V6    V7   V8
0   Tri1  D D   D D  D D    D D   D D   D D
0   Tri2  D D   D D  D D    D D   D D   D D
0   Tri3  D D   D D  D D    D D   D D   D D
0   Tri4  D D   D D  D D    D D   D D   D D
0   Tri5  D D   D D  D D    D D   D D   D D

And I want to divide column V3-V8

V1  V2    V3 V4 V5 V6 V7 V8 V9 V10 V11 V12V13V14
0   Tri1  D  D  D  D  D  D  D  D   D   D   D  D
0   Tri2  D  D  D  D  D  D  D  D   D   D   D  D
0   Tri3  D  D  D  D  D  D  D  D   D   D   D  D
0   Tri4  D  D  D  D  D  D  D  D   D   D   D  D
0   Tri5  D  D  D  D  D  D  D  D   D   D   D  D

How may I do it?

CN_AE
  • 47
  • 5
  • You are looking for `strsplit`. – lmo Jan 23 '17 at 13:12
  • 4
    why not? What is the difference? The answer you provided exists as an answer in my dupe target – Sotos Jan 23 '17 at 13:19
  • 4
    @akrun what logic? The one you mention was duped with the reshape DATAFRAMES from long to wide etc....while it was not a data frame but a NESTED LIST. So it was correctly re-open...IMO. This, I fail to see the difference other than doing it for more columns – Sotos Jan 23 '17 at 13:26
  • 2
    @akrun, I disagree but I guess it is not only up to me. – Sotos Jan 23 '17 at 13:30

2 Answers2

3

With base R methods (but more complicated than @akruns answer):

lst.1 <- lapply(dat[3:8], strsplit, ' ')
lst.2 <- lapply(lst, function(x) matrix(unlist(x), ncol = 2, byrow = TRUE))
dat2 <- data.frame(dat[1:2], do.call(cbind, lst.2))
names(dat2) <- paste0('V',1:14)

This results in:

> dat2
  V1   V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
1  0 Tri1  D  A  D  D  D  D  D   D   D   D   D   D
2  0 Tri2  D  B  D  D  D  D  D   D   D   D   D   D
3  0 Tri3  D  C  D  D  D  D  D   D   D   D   D   D
4  0 Tri4  D  D  D  D  D  D  D   D   D   D   D   D
5  0 Tri5  D  E  D  D  D  D  D   D   D   D   D   D

With only D values its hard to see whether methods work or not. For that reason I used somewhat altered data:

dat <- read.table(text="V1,V2,V3,V4,V5,V6,V7,V8
0,Tri1,D A,D D,D D,D D,D D,D D
0,Tri2,D B,D D,D D,D D,D D,D D
0,Tri3,D C,D D,D D,D D,D D,D D
0,Tri4,D D,D D,D D,D D,D D,D D
0,Tri5,D E,D D,D D,D D,D D,D D", header = TRUE, sep = ',', stringsAsFactors = FALSE)
h3rm4n
  • 4,126
  • 15
  • 21
1

We can do this with cSplit

library(splitstackshape)
setnames(cSplit(df, 3:8, " "), paste0("V", 1:14))[]
#    V1   V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
#1:  0 Tri1  D  D  D  D  D  D  D   D   D   D   D   D
#2:  0 Tri2  D  D  D  D  D  D  D   D   D   D   D   D
#3:  0 Tri3  D  D  D  D  D  D  D   D   D   D   D   D
#4:  0 Tri4  D  D  D  D  D  D  D   D   D   D   D   D
#5:  0 Tri5  D  D  D  D  D  D  D   D   D   D   D   D
akrun
  • 874,273
  • 37
  • 540
  • 662