使用行中具有变量名称的数据重新编码列

时间:2015-01-08 09:48:35

标签: r plyr

我有两个数据框:

  • 包含lookup列(变量名称),varNamekey
  • 的查找表value
  • 数据框df的列名称与varName中的值完全相同,而key对应的值(df中的值是lookup的键)。该数据帧比查找数据帧(例如1e6行)大得多。

我想通过为每个变量添加新列来重新编码df中的数据,其中df中的键被value数据帧中的相应lookup替换。重要的是要注意键是double类型。

示例数据:

# Generate sample data
lookup <- data.frame(
  varName = rep(LETTERS[1:3], each = 3),
  key     = runif(9),
  value   = runif(9)
  )

df <- expand.grid(
  A = lookup[lookup$varName == 'A', 'key'],
  B = lookup[lookup$varName == 'B', 'key'],
  C = lookup[lookup$varName == 'C', 'key']
  )

我当前的解决方案使用临时重命名变量和来自join的{​​{1}}:

plyr

问题:

  • 这样安全吗?如果使用require(plyr) for (varName in unique(lookup$varName)) { tmpLookup <- rename(lookup, replace = c(key = varName)) df[paste0(varName, '_value')] <- join(df[varName], tmpLookup[c(varName, 'value')], by = varName)['value'] } df
  • 加入double将始终正常工作,我找不到任何信息
  • 有更好的方法来实现同样更安全,更快捷的方式吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试data.table。使用set.seed(20)创建“df”(用于再现性)。我使用melt将“df”改为“long”,而不是“宽”格式,转换为“data.table”(as.data.table),设置关键列(setkey(..) ),加入“查找”数据集,使用dcast.data.table将其转换回“宽”格式,最后加入原始数据集,以便在数据集中包含新旧列。这也可以使用for循环而不使用reshaping

来完成
library(data.table)
library(reshape2)
DT <- as.data.table(melt(as.matrix(df)))
DT1 <- dcast.data.table(setkey(DT, Var2,
           value)[lookup], Var1~Var2, value.var='i.value')
DT2 <- setkey(setDT(df)[,Var1:=1:.N], Var1)[DT1][,Var1:=NULL]

head(DT2,2)
#          A         B          C       i.A         i.B       i.C
#1: 0.8775214 0.5291637 0.09133259 0.3700745 0.001927939 0.4520996
#2: 0.7685332 0.5291637 0.09133259 0.7155276 0.001927939 0.4520996