在 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"的最后一个值。
我有几个数据集(“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"的最后一个值。