【发布时间】:2020-07-13 05:23:08
【问题描述】:
我有大约 100 个具有不同变量(以及不同数量的变量)的数据集,但每个数据集都有一个家庭 ID (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,读取每个列名,计算一个家庭被问到问题的次数,以及他们没有回答的次数。我尝试了各种方法,例如粘贴功能,但一直碰壁。
谢谢!
【问题讨论】:
-
欢迎来到stackoverflow。生成finaldf似乎有错字。我提供了更正,但请检查它是否符合您的预期。
标签: r function functional-programming