I have written a function that takes any DataFrame and evaluates each column to return a summary table. Now, for any Variable Name
that is a factor as classified under the Answer Label
column, I would like to shift the Variable Type
and Answer Code
down one row.
Sample Code:
CreateCodebook <- function(dF){
numbercols <- length(colnames(dF))
table <- data.frame()
for (i in 1:length(colnames(dF))){
AnswerCode <- if (sapply(dF, is.factor)[i]) 1:nrow(unique(dF[i])) else NA
AnswerLabel <- if (sapply(dF, is.factor)[i]) as.vector(unique(dF[order(dF[i]),][i])) else "Open ended"
VariableName <- if (length(AnswerCode) > 1) c(colnames(dF)[i],
rep(NA,length(AnswerCode) - 1)) else colnames(dF)[i]
VariableLabel <- if (length(AnswerCode) > 1) c(colnames(dF)[i],
rep(NA,length(AnswerCode) - 1)) else colnames(dF)[i]
VariableType <- if (length(AnswerCode) > 1) c(sapply(dF, class)[i],
rep(NA,length(AnswerCode) - 1)) else sapply(dF, class)[i]
df = data.frame(VariableName, VariableLabel, AnswerLabel, AnswerCode, VariableType, stringsAsFactors = FALSE)
names(df) <- c("Variable Name", "Variable Label", "Variable Type", "Answer Code", "Answer Label")
table <- rbind(table, df)
}
rownames(table) <- 1:nrow(table)
return(table)
}
Using this dataset MASS::anorexia
, I get this output from my Function:
Variable Name Variable Label Variable Type Answer Code Answer Label
1 Treat Treat CBT 1 factor
2 <NA> <NA> Cont 2 <NA>
3 <NA> <NA> FT 3 <NA>
4 Prewt Prewt Open ended NA numeric
5 Postwt Postwt Open ended NA numeric
Desired Output:
Variable Name Variable Label Variable Type Answer Code Answer Label
1 Treat Treat <NA> NA factor
2 <NA> <NA> CBT 1 <NA>
3 <NA> <NA> Cont 2 <NA>
4 <NA> <NA> FT 3 <NA>
5 Prewt Prewt Open ended NA numeric
6 Postwt Postwt Open ended NA numeric