подмножество строк значением при фильтрации столбцов в R - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть несколько наборов данных ("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" или использовать "rbind" для каждого "id", но мне пока не удалось получить правильную формулу. Кто-нибудь знает как это исправить?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Причина, по которой он не работал, заключается в том, что я должен включить "nobs" в цикл for, например:

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", как всегда, учитывает последнее значение«id» в дат.

0 голосов
/ 24 апреля 2018

Попробуйте что-то вроде этого

Я редактирую вашу функцию для обработки одного файла и возвращает количество строк после фильтрации из строк с помощью 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...