编辑-我已经删除了以前的写作,给我的编辑让路,如果你能帮我的忙。
我想开始一个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行是1s,2000是2s等等,这些都不准确)
通过这样做,我可以根据每个ID值(Integer)选择硝酸盐值(数值),并在这些值之间找到平均值。我该怎么做呢?
数据是这样的
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。我将研究如何将这些值合并到一个列表中,从一个代码中从硫酸盐或硝酸盐的整数值中提取平均值。我确实希望创建一个函数是必要的,所以任何提示都是值得赞赏的!
发布于 2019-07-05 22:27:57
只需将您的数据帧列表连接起来,然后采取所需的列方法。甚至可以考虑使用tapply (兄弟到lapply)来计算case编号或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)))https://stackoverflow.com/questions/56902094
复制相似问题