使用向量进行R值映射

时间:2016-12-15 23:09:30

标签: r mapping rstudio find-replace

我正在寻找一个类似于FindReplace的功能,它允许我根据矢量而不是单个值来映射值。

我有一个看起来像这样的查找表,我想用它来映射数据框中的值。

Headers: COLUMN_NAME, CODE, DESCRIPTION
Row1: arrmin, 97, Officially Cancelled
Row2: arrmin, 98, Unknown if Arrived
Row3: atmcond, -1, Blank
Row4: atmcond, 0, No Additional Atmospheric Conditions

此查找表有数千行,因此我无法手动输入,而我原来的解决方案效率太低,需要数天才能运行。

我使用的数据框有数百个列,例如arrminatmcond,需要将值从97更改为正式取消等等。

0-100(或者有多少数值)的值会根据它所在的列而改变。我在下面编写了这段代码,但实际上效率很低,需要花费数天来运行300k行。

columnsToReplace <- which(colnames(CRASH) %in% CapitalColumns)
dfColumns <- colnames(CRASH)
for (i in columnsToReplace){
  tempColumn <- dfColumns[i]
  tempLookup <- capitalLookupTable[which(capitalLookupTable$COLUMN_NAME ==tempColumn),]
  CRASH <- FindReplace(data=CRASH,Var=tempColumn,replaceData = capitalLookupTable,
           from = "Code",to = "Description",exact=T)
}

columnsToReplace是我创建的一个向量,它包含查找表中存在的每个列的字符串名称。

1 个答案:

答案 0 :(得分:0)

#Some data
s<-data.frame(A=c(1,1,2,2),B=c(2,4,6,6),C=c(1,3,5,7))
mapping<-data.frame(ColumnName=c(rep("A",2), rep("B",3), rep("C",4)), Code=c(1,2,2,4,6,1,3,5,7))
mapping$Description<-paste0(mapping$ColumnName, mapping$Code)

#From wide to long
library(reshape)
melted.s<-melt(s)

#Join
melted.s<-merge(melted.s, mapping, by.x=c("variable","value"), by.y=c("ColumnName","Code"))

#From long to wide
p<-data.frame(matrix(melted.s$Description, ncol=ncol(s)))
names(p)<-names(s)