【问题标题】:How to subset a large data frame through FOR loops and print the desired result?如何通过 FOR 循环对大型数据框进行子集化并打印所需的结果?
【发布时间】:2016-01-17 13:08:52
【问题描述】:

我有一个看起来像这样的数据框:

x    y
1    a
1    b
1    c
1    NA
1    NA
2    d
2    e
2    NA
2    NA

我想要的输出应该是一个数据框,它应该显示 Y 的所有完整案例(即非 NA 值)与相应 X 的总和。因此,如果假设 Y 对 X = 1 有 2500 个完整观察值,和 X = 2 的 557 个观察值,我应该得到这个简单的数据框:

x    y(c.cases)
1    2500
2    557

目前我的函数表现良好,但仅适用于单个 X,但当我提到 X 是一个范围(例如 30:25)时,我会得到所有指定 Y 的总和,而不是每个 X 的单独完整观察值。这是我的功能大纲:

complete <- function(){
    files <- file.list()
    dat<- c() #Creates an empty vector
    Y <- c()  #Empty vector that will list down the Ys
    result <- c()
    for(i in c(X)){
            dat <- rbind(dat, read.csv(files[i]))
            }
            dat_subset_Y <- dat[which(dat[, 'X'] %in% x), ]
            Y <- c(Y, sum(complete.cases(dat)))
            result <- cbind(X, Y)
            print(result)
    }

没有错误或警告消息,但只有一系列 X 中的错误结果。

【问题讨论】:

  • 我想知道为什么有这么多关于 SO 请求使用 FOR 循环的解决方案的 R 问题。
  • @RHertel 那是因为循环是最常见的方法之一,像 dplyr 这样的包提供了独特的新语法来代替这些循环,大多数人并没有完全意识到这一点,而像我这样的人仍然掌握它。
  • 有些事情不知道也没关系,这里有很多人愿意给出很好的提示。令我惊讶的是,尽管缺乏知识,但仍有几个问题要求以特定方式解决问题——比如使用 FOR 循环。 FOR 循环在 R 中并不常见,而且在许多情况下充其量是不必要的(顺便说一下,这与 dplyr 无关,它只是许多有用的包之一,而不是使用 FOR 循环作为起点的原因通常不是R 中的好主意。 FOR 循环在某些情况下可能很有用,但在 R 中这些是相当例外的)。
  • @RHertel 如果这些问题是同一个人一遍又一遍地问的问题,那我也会觉得很奇怪。

标签: r loops for-loop dataframe subset


【解决方案1】:

不需要那个循环。

library(dplyr)
df %>%
  filter(complete.cases(.))%>%
  group_by(x) %>%
  summarise(sumy=length(y))

或者

df %>% 
  group_by(x) %>% 
  summarise(sumy=sum(!is.na(y)))

【讨论】:

  • 谢谢@DavidArenburg
【解决方案2】:

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df1)),按'x'分组,得到所有非NA元素的sum!is.na(y))。

library(data.table)
setDT(df1)[, list(y=sum(!is.na(y))), by = x]

或者另一个选项是table

with(df1, table(x, !is.na(y)))

【讨论】:

  • 还有 aggregate(y ~ x, df, function(z) sum(!is.na(z)))with(df, tapply(y, x, FUN = function(z) sum(!is.na(z)))) 以及 dplyr 的东西,等等/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2018-06-21
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多