2011-11-01 6 views
18

Tôi có một dataframe lớn, nhưng ví dụ nhỏ sẽ là như thế này:transposing một dataframe duy trì cột đầu tiên là tiêu đề

mydf <- data.frame(A = c(letters[1:10]), M1 = c(11:20), M2 = c(31:40), M3 = c(41:50)) 

Tôi muốn transpose các dataframe và duy trì các cột 1 (A) như tiêu đề cột (ký tự [1:10]) dưới dạng tên biến. Sau đây là các thử nghiệm đầu của mã không thành công.

tmydf = data.frame(t(mydf)) 
names(tmydf) <- tmydf[1,] 

Cảm ơn;

+1

Bạn không cần phải gọi 'c' cho chuỗi được tạo bằng dấu hai chấm. Vì vậy, '11: 20' cũng giống như 'c (11:20)', và 'chữ cái [1:10]' cũng giống như 'c (chữ cái [1:10])'. –

Trả lời

38

Dưới đây là một cách

tmydf = setNames(data.frame(t(mydf[,-1])), mydf[,1]) 
+0

Có một số chủ đề tương tự xung quanh, như sau: http://stackoverflow.com/questions/6645524/what-is-the-best-way-to-transpose-a-data-frame-in-r-and-to- set-one-the-column hoặc this: http://stackoverflow.com/questions/6778908/r-transposing-a-data-frame. Tôi thích câu trả lời của bạn tốt nhất cho đến nay, +1. Nó đơn giản, đáng tin cậy và giữ số như nó được. –

5

Cái gì đó như có lẽ đây:

tmp <- as.data.frame(t(mydf[,-1])) 
> colnames(tmp) <- mydf$A 
> tmp 
    a b c d e f g h i j 
M1 11 12 13 14 15 16 17 18 19 20 
M2 31 32 33 34 35 36 37 38 39 40 
M3 41 42 43 44 45 46 47 48 49 50 
1

Data.table variante từ Ramnath với chỉ trong chuỗi tên biến mong muốn.

mydf <- data.table(A = c(letters[1:10]), M1 = c(11:20), M2 = c(31:40), M3 = c(41:50)) 
tmydf <- setNames(data.table(t(mydf[,-"A"])), mydf[["A"]])