Rabiul Islam
Rabiul Islam

Reputation: 45

Manipulating a Data frame in R

I am new in R. I have data frame

A 5 8 9 6
B 8 2 3 6
C 1 8 9 5

I want to make

A 5
A 8
A 9
A 6
B 8
B 2
B 3
B 6
C 1
C 8
C 9
C 5

I have a big data file

Upvotes: 1

Views: 99

Answers (3)

Michiel uit het Broek
Michiel uit het Broek

Reputation: 993

If you could use a matrix you can just 'cast' it to a vector and add the row names. I have assumed that you really want 'a', 'b', 'c' as row names.

n <- 3;
data <- matrix(1:9, ncol = n);
data <- t(t(as.vector(data)));
rownames(data) <- rep(letters[1:3], each = n);

If you want to keep the rownames from your first data frame this is ofcourse also possible without libraries.

n <- 3;
data <- matrix(1:9, ncol=n);
names <- rownames(data);
data <- t(t(as.vector(data)))
rownames(data) <- rep(names, each = n)

Upvotes: 0

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193507

Assuming you're starting with something like this:

mydf <- structure(list(V1 = c("A", "B", "C"), V2 = c(5L, 8L, 1L), 
                       V3 = c(8L, 2L, 8L), V4 = c(9L, 3L, 9L), 
                       V5 = c(6L, 6L, 5L)), 
                  .Names = c("V1", "V2", "V3", "V4", "V5"), 
                  class = "data.frame", row.names = c(NA, -3L))
mydf
#   V1 V2 V3 V4 V5
# 1  A  5  8  9  6
# 2  B  8  2  3  6
# 3  C  1  8  9  5

Try one of the following:

library(reshape2)
melt(mydf, 1)

Or

cbind(mydf[1], stack(mydf[-1]))

Or

library(splitstackshape)
merged.stack(mydf, var.stubs = "V[2-5]", sep = "var.stubs")

The name pattern in the last example is unlikely to be applicable to your actual data though.

Upvotes: 3

Jake
Jake

Reputation: 520

Someone could probably do this in a better way but here I go... I put your data into a data frame called data

#repeat the value in the first column (c - 1) times were c is the number of columns (data[1,])
rep(data[,1], each=length(data[1,])-1)

#turning your data frame into a matrix allows you then turn it into a vector...
#transpose the matrix because the vector concatenates columns rather than rows
as.vector(t(as.matrix(data[,2:5])))

#combining these ideas you get...
data.frame(col1=rep(data[,1], each=length(data[1,])-1),
col2=as.vector(t(as.matrix(data[,2:5]))))

Upvotes: 0

Related Questions