R Ошибка в именах (x) <- значение, зависящее от диаграмм диапазона в цикле - PullRequest
0 голосов
/ 19 июня 2020

У меня большой набор данных с 270 столбцами и 17392 строками. Из этих 270 мне нужно выбрать 235. Строки можно сгруппировать по «сайту», который представляет собой уникальное числовое значение c (например, 1, 2 и c - всего 111 различных сайтов). Каждый столбец представляет собой «регион». Вот небольшой пример (обратите внимание, что столбцов и тем намного больше):

SubjID LLatVent RLatVent FullSurfArea Site
Subj1  1580.6    2345      180980      1
Subj2  4803.8    2232      210003      1
Subj3  14936     1456      198045      2
Subj4  14556     1200      176079      2

Моя цель - вычислить количество выбросов для каждого региона, сгруппированных по сайтам, и распечатать CSV-файл с результат. Мой код работает, если я использую 1,5 * IQR, но я получаю сообщение об ошибке, если использую 2,5 * IQR, и я не понимаю, почему. Ошибка:

Error in names(x) <- value : 'names' attribute [235] must be the same length as the vector [1]

Моя попытка кода (неудачная):

#start
ALL <- read.csv("ALL.csv")

#get rows of interest (235)

start <- which(colnames(ALL)=="LLatVent")
end <- which(colnames(ALL)=="FullSurfArea")

#create vector with these row numbers

regions <- start:end

#divide by site (111 sites in total)

  df_list <- split(ALL, as.factor(ALL$Site))

  #loop through regions and save subjID in ALL frame outliers_subjID

  for (j in df_list){
    outliers_subjID_list <- list()
    count <- 0
    for (i in regions){
    count <- count + 1
    OutVals <- boxplot(j[,i], plot=FALSE, range=2.5)$out
    outliers_subjID_list[[count]] <- j$SubjID[which(j[,i] %in% OutVals)]
  }
  n.obs <- sapply(outliers_subjID_list, length)
  seq.max <- seq_len(max(n.obs))
  outliers_subjID <- as.data.frame(sapply(outliers_subjID_list, "[", i = seq.max))
  colnames(outliers_subjID) <- colnames(j)[regions]

#write csv files

    write.csv(outliers_subjID, paste0(unique(j$Site), ".csv"))
  }

Почему я получаю сообщение об ошибке при использовании range = 2,5? То же самое происходит, если я использую boxplot.stats (as.matrix (j [, i]), coef = 2.5) $ out.

Кроме того, я хочу рассчитать общее количество выбросов для каждого региона после того, как они были рассчитаны сайтом. На данный момент я привязываю все файлы csv, а затем использую summarise_all для расчета количества наблюдений для каждого региона, но я чувствую, что есть более умный способ.

Заранее большое спасибо, пожалуйста, дайте мне знать, если я может предоставить дополнительную информацию.

1 Ответ

0 голосов
/ 19 июня 2020

Вероятно, это потому, что в некоторых регионах нет больших выбросов, определяемых в 2,5 раза больше IQR. Вы можете предотвратить ошибку, пропустив строку, вызывающую ошибку, с помощью оператора if.

for (i in regions){
  count <- count + 1 # maybe move this
  OutVals <- boxplot(j[,i], plot=FALSE, range=2.5)$out

  if(length(OutVals)>0)  # <-- add this line
    outliers_subjID_list[[count]] <- j$SubjID[which(j[,i] %in% OutVals)]
}

Поскольку у меня нет ваших данных, это невозможно проверить. Возможно, вам придется немного изменить код. Например, count может потребоваться переместить в оператор if.

...