首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使“id”在我的for循环中工作,以及“目录”中的平均值

如何使“id”在我的for循环中工作,以及“目录”中的平均值
EN

Stack Overflow用户
提问于 2019-07-05 11:20:03
回答 1查看 84关注 0票数 0

编辑-我已经删除了以前的写作,给我的编辑让路,如果你能帮我的忙。

我想开始一个for循环,它将遍历目录的所有332个情况,选择硝酸盐或硫酸盐值,并从这些值中取平均值。

我已经想好了如何单独地做这件事,但是这需要用这个方法写很多东西。如何将其实现为for循环?请给我指点方向,不要给出完整的答案。

代码语言:javascript
复制
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)选择硝酸盐值(数值),并在这些值之间找到平均值。我该怎么做呢?

数据是这样的

代码语言:javascript
复制
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

到目前为止,代码如下所示

代码语言:javascript
复制
                  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。我将研究如何将这些值合并到一个列表中,从一个代码中从硫酸盐或硝酸盐的整数值中提取平均值。我确实希望创建一个函数是必要的,所以任何提示都是值得赞赏的!

EN

回答 1

Stack Overflow用户

发布于 2019-07-05 22:27:57

只需将您的数据帧列表连接起来,然后采取所需的列方法。甚至可以考虑使用tapply (兄弟到lapply)来计算case编号或ID。

代码语言:javascript
复制
# 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)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56902094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档