user2702613
user2702613

Reputation: 53

Moving last two elements of each row of a dataframe

I am stuck on this problem and would be happy for advice. I have the following data.frame:

c1 <- factor(c("a","a","a","a"))
c2 <- factor(c("b","b","y","b"))
c3 <- factor(c("c","y","z","c"))
c4 <- factor(c("y","z","","y"))
c5 <- factor(c("z","","","z"))
x <- data.frame(c1,c2,c3,c4,c5)

So this data looks like this:

 c1 c2 c3 c4 c5
1  a  b  c  y  z
2  a  b  y  z   
3  a  y  z      
4  a  b  c  y  z

So in each row, there is a sequence of varying length of a, b, c which concludes with values for y and z. What I need to do is to move values y and z each to separate column that I can work with, so the data looks like this:

  c6 c7 c8 c9 c10
1  a  b  c  y   z
2  a  b     y   z
3  a        y   z
4  a  b  c  y   z

I have worked out to identify the length of each sequence per row and added that as a column, so I know which column y and z is located in:

x$not.na <- apply(paths, 1, function(x) length(which(!x=="")))

But I am stuck on how to loop(?) over each row to perform the necessary cut and paste of z and y.

Upvotes: 3

Views: 108

Answers (1)

mrip
mrip

Reputation: 15163

Something like this:

lastTwoToEnd<-function(x){
  i<-sum(x!="")-1:0
  x[c(setdiff(seq_along(x),i),i)]
}
data.frame(t(apply(x,1,lastTwoToEnd)))
##   X1 X2 X3 X4 X5
## 1  a  b  c  y  z
## 2  a  b     y  z
## 3  a        y  z
## 4  a  b  c  y  z

Upvotes: 4

Related Questions