如何通过 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)))
我有一个看起来像这样的数据框:
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)))