예비 사항 :이 질문은 대부분 교육적 가치를 지니고 있지만 접근 방법이 완전히 최적화되지는 않았더라도 실제 작업이 완료되었습니다. 제 질문은 코드가 속도를 최적화하거나보다 우아하게 구현할 수 있는지 여부입니다.. 아마도 plyr 또는 reshape와 같은 추가 패키지를 사용합니다. 실제 데이터에서 실행하면 시뮬레이션 된 데이터보다 훨씬 높은 약 140 초가 걸립니다. 일부 원본 행에는 NA가 포함되어 있으므로 추가 검사가 필요합니다. 비교하기 위해 시뮬레이션 된 데이터는 약 30 초 내에 처리됩니다. 최적화 : 데이터 프레임을 데이터 프레임 목록으로 분할하고 행당 데이터 변환
조건
는 : 데이터 세트는 360 개 변수, (12)의 30 배 세트의이 V1_1, V1_2 (첫번째 설정), V2_1, V2_2이 (두 번째 세트) 등을 이름하자가 포함되어 있습니다. 12 개 변수의 각 집합은 실제적으로 진로 상태에 해당하는 이분법 (예/아니오) 응답을 포함합니다. 예 : 일 (예/아니오), 연구 (예/아니오) 등 총 12 가지 상태가 30 번 반복됩니다.작업 : 12 개 이분법 변수의 각 집합을 12 개의 응답 범주 (예 : 직장, 학습 ...)가있는 단일 변수로 다시 코딩하는 작업이 있습니다. 궁극적으로 우리는 12 개의 응답 범주를 가진 30 개의 변수를 얻어야합니다.
데이터 : 나는 실제 데이터 집합을 게시 할 수 없습니다, 그러나 여기 좋은 시뮬레이션 근사 :
randomRow <- function() {
# make a row with a single 1 and some NA's
sample(x=c(rep(0,9),1,NA,NA),size=12,replace=F)
}
# create a data frame with 12 variables and 1500 cases
makeDf <- function() {
data <- matrix(NA,ncol=12,nrow=1500)
for (i in 1:1500) {
data[i,] <- randomRow()
}
return(data)
}
mydata <- NULL
# combine 30 of these dataframes horizontally
for (i in 1:30) {
mydata <- cbind(mydata,makeDf())
}
mydata <- as.data.frame(mydata) # example data ready
내 솔루션 :
이# Divide the dataset into a list with 30 dataframes, each with 12 variables
S1 <- lapply(1:30,function(i) {
Z <- rep(1:30,each=12) # define selection vector
mydata[Z==i] # use selection vector to get groups of variables (x12)
})
recodeDf <- function(df) {
result <- as.numeric(apply(df,1,function(x) {
if (any(!is.na(df))) which(x == 1) else NA # return the position of "1" per row
})) # the if/else check is for the real data
return(result)
}
# Combine individual position vectors into a dataframe
final.df <- as.data.frame(do.call(cbind,lapply(S1,recodeDf)))
모두 모두, 이중이는 * 하나는 목록에, 다른 하나는 데이터 프레임 행에 적용됩니다. 이것은 약간 느립니다. 어떤 제안? 미리 감사드립니다.
(+1) 매우 멋지게 프레임 된 질문입니다. – Arun