假设我有一个数据帧df1,其中包含A B C D列和全部为零
A B C D E
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
另一个df2,其值为B和C
Name Value
B 5
D 2
E 1
我希望将值分配给相应的列。 结果应该是
A B C D E
0 5 0 2 1
0 0 0 0 0
0 0 0 0 0
答案 0 :(得分:0)
如果您有多个记录,每个记录都在自己的表中,其中每一行都包含测量名称和相应的值,所需的输出应该是一个连接表,其中每个测量都有自己的行,列表示测量类型,这应该有助于实现它。
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) ) )