我如何在循环中获取“ id”以及“目录”中的均值

时间:2019-07-05 11:20:03

标签: r

编辑-我删除了以前的著作,为显示我的编辑以及您是否可以帮助我提供了帮助

我想开始一个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。我将研究如何将它们合并到一个列表中,以一个代码从硫酸盐或硝酸盐的这些整数值中提取平均值。我确实希望将需要创建一个函数,因此感谢所有提示!

1 个答案:

答案 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)))