将值与Dataframe中的列匹配

时间:2017-09-25 12:04:34

标签: r dataframe match

假设我有一个数据帧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

1 个答案:

答案 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) ) )