【问题标题】:subset rows by a value while filtering columns in R在过滤R中的列时按值子集行
【发布时间】:2018-04-24 18:55:47
【问题描述】:

我有几个数据集(“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”,但到目前为止我未能获得正确的公式。 有谁知道如何解决这个问题?

【问题讨论】:

  • 您将函数命名为 function?好的,R 可以做到这一点,但通常只有当您想混淆自己和他人时,这才是一个好主意。 library("fortunes"); fortune(77)

标签: r function dataframe subset rbind


【解决方案1】:

试试这样的

我编辑你的函数来处理单个文件并在过滤 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")

【讨论】:

  • 这里的“fi”是什么意思?
  • ficount_nobs 环境中的局部变量。它采用通过函数调用传递给它的值 - count_nobs(data)。您可以通过这种方式传递不同的值 - count_nobs(list_files[1])count_nobs(list_files[2]) - 但该函数将知道以 fi 对其进行操作
  • 看简单函数:P &lt;- function(s) { print(s) }P(1)P(2)
  • 当我按照您的建议运行时,我收到此错误:> 结果
  • 什么意思?
【解决方案2】:

它不起作用的原因是我应该在 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”的最后一个值。

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2021-08-12
    • 2016-09-23
    • 2021-10-05
    相关资源
    最近更新 更多