编辑-我删除了以前的著作,为显示我的编辑以及您是否可以帮助我提供了帮助
我想开始一个for循环,它将遍历目录的所有332个案例,挑选出硝酸盐或硫酸盐值,并从这些值中取平均值。
我已经找到了如何单独执行此操作的方法,但是,使用此方法需要花费大量时间。如何将其实现为for循环?请直接指出我的方向,而不给出完整的答案。
specdata <- list.files(getwd(), pattern="*.csv")
directory <- lapply(specdata, read.csv)
name_1 <- get("nitrate", envir = as.environment(directory[[1]]))
name_2 <- na.omit(name_1)
name_3 <- name_2[1:122]
pollutantmean <- function(directory, pollutant, id = 1:332) {
for( ?) {
???
}
??????
}
我经历了另一种方法。这涉及删除选定的列(硫酸盐和日期),仅保留硝酸盐和ID。然后我省略了NA值,现在ID为332个案例计算了每个硝酸盐值。我的下一步是确定如何通过整数值而不是按行选择ID。例如,如果我print(final_df$ID[1:32])
仅发回前32行的整数值,而不发回前32种情况,即1、2、3 ... 32(通常为1、1、1 ... 1,因为列表很大,前1000个是1,2000是2,依此类推,这是不正确的)
这样做,我可以按每个ID值(整数)选择硝酸盐值(数字),并找到这些值之间的平均值。我将如何去做?
数据是这样的
Data Sulphate Nitrate ID
10/10/10 0.576 0.784 1
10/10/10 0.738 0.687 1
. . . .
. . . .
11/11/11 0.954 1.093 2
. . . .
. . . .
. . . .
13/13/13 0.495 0.586 332
final_df$date <- NULL
final_df$Sulphate <- NULL
到目前为止,代码看起来像这样
specdata <- list.files(getwd(), pattern="*.csv")
directory <- lapply(specdata, read.csv)
directory_final <- do.call(rbind, directory)
one <- select(directory, nitrate:ID) a <- select(directory, sulfate, ID)
two <- na.omit(two) b <- na.omit(a)
three <- filter(two, ID %in% 1:30) c <- filter(b, ID %in% 1:30)
four <- mean(two$nitrate) d <- mean(c$sulfate)
它以可以提取我可能需要的值的方式工作,但是,从长远来看,这是非常不切实际的。我必须创建8段代码来检索属于硫酸盐或硝酸盐的整数列表的平均值。如果我想要另一组值,则必须回到3&c,更改这些值,然后重复4&d。我将研究如何将它们合并到一个列表中,以一个代码从硫酸盐或硝酸盐的这些整数值中提取平均值。我确实希望将需要创建一个函数,因此感谢所有提示!
答案 0 :(得分:0)
仅连接数据帧列表,然后采用所需的列方式。甚至考虑使用tapply
(与lapply
的兄弟姐妹)来根据案例编号或ID来计算均值。
# RETRIEVE ALL CSVs IN WORK DIRECTORY
specdata <- list.files(getwd(), pattern="*.csv")
# BUILD LIST OF DATA FRAMES
df_list <- lapply(seq_along(specdata), function(i)
transform(read.csv(specdata[i]), case_no = i))
# COMBINE ALL DFs INTO SINGLE, LONG DF
final_df <- do.call(rbind, df_list)
# CALCULATE MEANS BY 332 CASE NUMBERS
nitrate_mean_case_vector <- with(final_df, tapply(Nitrate, case_no, mean))
sulfate_mean_case_vector <- with(final_df, tapply(Sulfate, case_no, mean))
# CALCULATE MEANS BY FIRST 20 IN EACH CASE
nitrate_mean_id_vector <- with(final_df, tapply(Nitrate, case_no,
function(x) head(mean(x), 20)))
sulfate_mean_id_vector <- with(final_df, tapply(Sulfate, case_no,
function(x) head(mean(x), 20)))