Chuyển đổi khung dữ liệu


107

Tôi cần chuyển một khung dữ liệu lớn và vì vậy tôi đã sử dụng:

df.aree <- t(df.aree)
df.aree <- as.data.frame(df.aree)

Đây là những gì tôi nhận được:

df.aree[c(1:5),c(1:5)]
                         10428        10760        12148        11865
    name                M231T3       M961T5       M960T6      M231T19
    GS04.A        5.847557e+03 0.000000e+00 3.165891e+04 2.119232e+04
    GS16.A        5.248690e+04 4.047780e+03 3.763850e+04 1.187454e+04
    GS20.A        5.370910e+03 9.518396e+03 3.552036e+04 1.497956e+04
    GS40.A        3.640794e+03 1.084391e+04 4.651735e+04 4.120606e+04    

Vấn đề của tôi là các tên cột mới (10428, 10760, 12148, 11865) mà tôi cần loại bỏ vì tôi cần sử dụng hàng đầu tiên làm tên cột.

Tôi đã thử với col.names()chức năng nhưng tôi không nhận được những gì tôi cần.

Bạn có gợi ý nào không?

BIÊN TẬP

Cảm ơn đề nghị của bạn !!! Sử dụng nó tôi có được:

df.aree[c(1:5),c(1:5)]
                        M231T3       M961T5       M960T6      M231T19
    GS04.A        5.847557e+03 0.000000e+00 3.165891e+04 2.119232e+04
    GS16.A        5.248690e+04 4.047780e+03 3.763850e+04 1.187454e+04
    GS20.A        5.370910e+03 9.518396e+03 3.552036e+04 1.497956e+04
    GS40.A        3.640794e+03 1.084391e+04 4.651735e+04 4.120606e+04
    GS44.A        1.225938e+04 2.681887e+03 1.154924e+04 4.202394e+04

Bây giờ tôi cần chuyển đổi tên hàng (GS ..) trong một cột nhân tố ....


1
Bạn đã thử colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]chưa?

5
Khung dữ liệu tự nhiên không có nghĩa là có thể chuyển đổi được. Nếu là của bạn, thì có lẽ nó phải ở dạng ma trận.
Richie Cotton,

Đồng ý; tkhung dữ liệu ing cũng khá kém hiệu quả. Nếu bạn có thể, hãy sử dụng ma trận.
mbq

5
Chuyển đổi data.frame có chứa một cột chuỗi trong đó biến TẤT CẢ các giá trị thành chuỗi! Không tốt. Xem câu trả lời của tôi bên dưới để biết cách giải quyết.
Tommy

Câu trả lời:


109

Tốt hơn bạn không nên hoán vị data.frame khi cột tên đang ở trong đó - tất cả các giá trị số sau đó sẽ được chuyển thành chuỗi!

Đây là một giải pháp giữ số dưới dạng số:

# first remember the names
n <- df.aree$name

# transpose all but the first column (name)
df.aree <- as.data.frame(t(df.aree[,-1]))
colnames(df.aree) <- n
df.aree$myfactor <- factor(row.names(df.aree))

str(df.aree) # Check the column types

49
df.aree <- as.data.frame(t(df.aree))
colnames(df.aree) <- df.aree[1, ]
df.aree <- df.aree[-1, ]
df.aree$myfactor <- factor(row.names(df.aree))

@Riccardo Nếu vậy, hãy chấp nhận câu trả lời của anh ấy bằng cách nhấp vào dấu tích màu xám bên cạnh nó.
mbq

4
một vấn đề với điều này - tên cột lấy biểu diễn số của cấp nhân tố.
Harry Palmer

48

Bạn có thể sử dụng transposechức năng từ data.tablethư viện. Giải pháp đơn giản và nhanh chóng giữ nguyên numericgiá trị numeric.

library(data.table)

# get data
  data("mtcars")

# transpose
  t_mtcars <- transpose(mtcars)

# get row and colnames in order
  colnames(t_mtcars) <- rownames(mtcars)
  rownames(t_mtcars) <- colnames(mtcars)

4
cũng có, setnames(t_mtcars, rownames(mtcars))sẽ là data.tablehai chiều của tên đang ngồi trên một data.table (và nếu sử dụng một data.tableđối tượng bạn sẽ không thiết lập rownames)
SymbolixAU

Đây là giải pháp tốt nhất cho đến nay! +1.
HelloWorld

1

Tận dụng as.matrix:

# keep the first column 
names <-  df.aree[,1]

# Transpose everything other than the first column
df.aree.T <- as.data.frame(as.matrix(t(df.aree[,-1])))

# Assign first column as the column names of the transposed dataframe
colnames(df.aree.T) <- names
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.