在 R 中过滤列时按值子集行

subset rows by a value while filtering columns in R

我有几个数据集(“001.csv”、“002.csv”,等等,直到 332)存储在同一个文件夹中,具有以下结构(示例):

id  p1    p2    
2   35.0  na    
2   5.00  2.05  
2   0.35  1.56  
2   na    0.79 
2   5.23  0.13
2   5.01  0.03

我需要创建一个函数来读取一个或多个文件并返回 "p1" 和 "p2" 都具有给定值(即没有 NA)的情况的数量,为此我写了这个:

cc <- function(directory, id=1:332) {
    files_list <- list.files(directory, full.names = TRUE)
    for (i in id) {
            dat <- read.csv(files_list[i])
    }
    nobs <- length(which(!is.na(dat$p1) & !is.na(dat$p2)))
    completecases <- data.frame(id, nobs)
    completecases
    }

如果我为 "id" 选择单个值,这将非常有效;在这种情况下,结果将类似于:

> cc(directory, 1)
    id nobs
    1  3

但是,如果我想知道多个文件中的观察次数,它会返回每个 "id" 中最大值 "id" 的观察次数。例如,

> cc(directory, 1:2)
    id nobs
    1  4
    2  4

而不是:

> cc(directory, 1:2)
    id nobs
    1  3
    2  4

我认为我需要通过 "id" 对我的数据进行子集化或对每个 "id" 使用 "rbind",但到目前为止我未能获得正确的公式。 有谁知道如何解决这个问题?

尝试这样的事情

我编辑你的函数来处理单个文件和 return 过滤后的行数 out 行 NA

count_nobs <- function(fi) {
    require(dplyr)
    dat <- read.csv(fi)
    dat[complete.cases(dat), ] %>% count()
}

使用 purrr:map_dfr 调用函数,该函数遍历 files_list 并绑定结果

library(tidyverse)
files_list <- list.files(directory, full.names=TRUE)
result <- map_dfr(files_list, ~count_nobs(.x), .id="id")

它不起作用的原因是我应该在 for 循环中包含 "nobs",例如:

cc <- function(directory, id=1:332) {
files_list <- list.files(directory, full.names = TRUE)
nobs <- c()
for (i in id) {
        dat <- read.csv(files_list[i])
        nobs <- c(nobs, length(which(!is.na(dat$p1) & !is.na(dat$p2))))
}
completecases <- data.frame(id, nobs)
completecases
}

不考虑它,"nobs"总是占dat中"id"的最后一个值。