我有两个数据框:
lookup
列(变量名称),varName
和key
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
将始终正常工作,我找不到任何信息
答案 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