如果您有多条记录,每条记录在自己的表中,其中每一行包含测量的名称和相应的值,并且所需的输出应该是一个连接表,其中每个测量都有自己的行,列代表测量类型,那么这应该有助于实现它。
library(plyr) # for using rbind.fill
# sample data
df2 <- data.frame( name=c("B", "D", "E"), value=c(1, 2, 3) )
df3 <- data.frame( name=c("A", "E", "B"), value=c(2, 2, 8) )
df4 <- data.frame( name=c("B", "C", "D"), value=c(6, 5, 0) )
df5 <- data.frame( name=c("B", "A", "C"), value=c(7, 2, 9) )
# transpose each table and row bind them together
df <- rbind.fill( lapply( list( df2, df3, df4, df5 ), function(x) {
setNames( data.frame(t(x[,-1])), x[,1] )
} ) )
# order columns in alphabetic order
df <- df[, order( names(df) ) ]
当然,这可以内置到读入过程中。
# list files with our pattern
filename.list <- list.files( "df.*csv", path = "./" )
# read in and join them
df <- rbind.fill( lapply( filename.list, function(filename) {
x <- read.csv( filename )
x <- setNames( data.frame(t(x[,-1])), x[,1] )
}))
# order columns in alphabetic order
df <- df[, order( names(df) ) ]
使用 data.table 的更紧凑的实现:
library( data.table )
filename.list <- list.files( "df.*csv", path = "./" )
dt <- rbindlist( lapply( lapply( filename.list, fread ), dcast, formula = '. ~ name' ) )[,-1]
setcolorder( dt, order( names(dt) ) )