Как мне заставить 'id' работать в моем цикле for и среднее значение из 'Directory' - PullRequest
0 голосов
/ 05 июля 2019

Правки - я удалил предыдущее письмо, чтобы показать свои правки, и если вы можете мне помочь

Я хочу начать цикл for, который пройдет все 332 случая Справочника, выберет значения нитратов или сульфатов и возьмет среднее из этих значений.

Я подумал, как сделать это индивидуально, однако, этот метод потребует много времени для написания. Как я могу реализовать это в цикл? пожалуйста, просто укажите мне направление, не давая полного ответа.

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( ?) {
   ???
}
??????
      }

Я прошел другой метод. Это включало удаление выбранных столбцов (сульфат и дата), оставляя только нитрат и идентификатор. Затем я опустил значения NA, и теперь ID подсчитывает каждое значение нитрата для 332 случаев. Мой следующий шаг - решить, как я собираюсь выбирать идентификатор по целому числу, а не по строке. например, если I print(final_df$ID[1:32]), то он возвращает только целочисленные значения первых 32 строк, а не первых 32 случаев, то есть 1, 2, 3 ... 32 (ранее это было 1, 1, 1 .. .1 поскольку список большой, а первые 1000 равны 1, 2000 - это 2, и т. Д., Они не являются точными)

После этого я могу выбрать значения нитратов (числовые) по каждому значению идентификатора (целое число) и найти среднее между этими значениями. Как мне это сделать?

Данные примерно такие

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 частей кода, чтобы получить среднее из списка целых чисел, принадлежащих либо к сульфату, либо к нитрату. И если мне нужен другой набор значений, мне нужно будет вернуться к трем и с, чтобы изменить эти значения, а затем повторить четыре и д. Я буду работать над тем, как включить их в один список, который может извлечь среднее из этих целочисленных значений для сульфата или нитрата в одном коде. Я ожидаю, что создание функции будет необходимо, поэтому любые советы приветствуются!

1 Ответ

0 голосов
/ 06 июля 2019

Просто объедините ваш список фреймов данных, а затем возьмите необходимые средства из столбцов. Рассмотрим даже tapply (брат lapply) для расчета средств по номеру дела или идентификаторам.

# 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...