【问题标题】:Match values to columns in a Dataframe将值与数据框中的列匹配
【发布时间】:2017-09-25 12:04:34
【问题描述】:

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

【问题讨论】:

  • 只有第一行?
  • df1[1, names(df1) %in% df2$Name] <- df2$Name
  • 我有很多 df2,每个都应该换行。我正在考虑使用循环......或者有更好的方法吗?
  • @prre72 “每个人都应该换行”是什么意思?您发布的所需输出仅修改了第一行
  • @prre72 做你想做的很容易,但你能编辑想要的输出以获得更多许可

标签: r dataframe match


【解决方案1】:

如果您有多条记录,每条记录在自己的表中,其中每一行包含测量的名称和相应的值,并且所需的输出应该是一个连接表,其中每个测量都有自己的行,列代表测量类型,那么这应该有助于实现它。

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

【讨论】:

  • 哇,太棒了!如果我有 100 张桌子怎么办?你能用循环来构建它吗?
  • 当然,您可以使用 lapply 构建一个 data.frames 列表。
  • 如果是您想要的,请将答案标记为已解决。谢谢!
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 2016-08-26
  • 1970-01-01
  • 2015-11-21
  • 2021-02-12
相关资源
最近更新 更多