2016-12-15 5 views
-1

FindReplace과 유사한 함수를 찾고 있는데, 단일 값이 아닌 벡터를 기반으로 값을 매핑 할 수 있습니다.R 벡터와 값 매핑

데이터 프레임에 값을 매핑하는 데 사용하는 것처럼 보이는 조회 테이블이 있습니다.

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 

이 조회 테이블 행의 수천이있다, 그래서 수동으로 입력 할 수없고, 내 원래의 솔루션은 너무 비효율적이며 실행하는 일이 소요됩니다.

(또는 존재하지만 많은 값)

값 0-100 등에서 97에서 변경된 값 공식적 취소해야하는 등 arrminatmcond과 같이 I는 수백 개의 컬럼을 갖는다 사용하고있는 dataframe, 이 열을 기반으로 변경하십시오.이 코드는 아래에 작성했지만 실제로는 비효율적이며 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

내가 그 룩업 테이블에 존재하는 컬럼의 각각의 문자열 이름을 포함 만든 벡터이다.

답변

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)