У меня примерно 100 наборов данных с разными переменными (и разным количеством переменных), но каждый набор данных имеет идентификатор домохозяйства (hh_ID) в качестве идентификатора. Переменные представляют вопросы опроса. Каждый CSV представляет другой тип опроса. Я хочу написать пользовательскую функцию, которая подсчитывает, сколько раз домашнему хозяйству задавали вопрос и сколько раз они пропустили вопрос (NA). У меня проблема с переименованием переменных и подсчетом в csvs.
Скажем, два кадра данных выглядят так:
hh_ID <- c(1,1,2,2,2)
question1 <- c(NA,1,0,0,0)
question2 <- c(1,1,NA,0,0)
df1 <- data.frame(hh_ID, question1, question2)
hh_ID <- c(1,1,1,2,2)
question3 <- c(NA,NA,0,0,0)
question4 <- c(1,1,1,NA,NA)
df2 <- data.frame(hh_ID, question3, question4)
## > df1
## hh_ID question1 question2
## 1 1 NA 1
## 2 1 1 1
## 3 2 0 NA
## 4 2 0 0
## 5 2 0 0
## > df2
## hh_ID question3 question4
## 1 1 NA 1
## 2 1 NA 1
## 3 1 0 1
## 4 2 0 NA
## 5 2 0 NA
Мне нужен окончательный кадр данных, чтобы он выглядел следующим образом:
question1_count <- c(2,3)
question1_NAs <- c(1,0)
question2_count <- c(2,3)
question2_NAs <- c(0,1)
question3_count <- c(3,2)
question3_NAs <- c(2,0)
question4_count <- c(3,2)
question4_NAs <- c(0,2)
finaldf <- data.frame(unique(hh_ID),question1_count, question1_NAs,question2_count,question2_NAs,question3_count,question3_NAs, question4_count,question4_NAs)
## > finaldf
## unique.hh_ID. question1_count question1_NAs question2_count question2_NAs question3_count question3_NAs question4_count question4_NAs
## 1 1 2 1 2 0 3 2 3 0
## 2 2 3 0 3 1 2 0 2 2
Это то, что у меня пока есть:
# read in each dta file
filenames <- list.files(path=mydirectory, pattern=".*dta")
for (i in 1:length(filenames)){
assign(filenames[i], read_dta(paste("", filenames[i], sep=''))
)}
variable_NA_count <- function(dataset, col_name){
temp <- dataset %>% group_by(hh_ID) %>% summarise(question_count = n())
temp1 <- aggregate(col_name ~ hh_ID, data=dataset, function(x) {sum(is.na(x))}, na.action = NULL)
final <- merge(temp, temp1, by = "hh_ID")
return(final)}
frequency <- function(dataset, col_name){
temp <- variable_NA_count(dataset, col_name)
temp <- temp %>% select(question1_count = question_count,
question1_NAs = col_name)}
Проблема в том, что я хочу, чтобы каждое имя переменной заканчивалось на "_count" и "_NAs" без явного написания "question1_count = question_count». У меня есть сотни переменных в csvs, поэтому мне нужна функция, которая читает каждый CSV, читает имя каждого столбца, подсчитывает, сколько раз домохозяйству задавали вопрос и сколько раз они не отвечали. Я пробовал разные способы, например функцию вставки, но продолжаю бить по стене.
Спасибо!