如何通过 FOR 循环对大型数据框进行子集化并打印出想要的结果?

How to subset a large data frame through FOR loops and print the desired result?

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

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

我想要的输出应该是一个数据框,它应该显示 Y 的所有完整案例(即非 NA 值)与相应的 X 的总和。所以如果假设 Y 有 2500 个完整的 X = 1,以及 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 范围内的错误结果。

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

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

或者另一种选择是table

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

不需要那个循环。

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

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