У меня есть фрейм данных, содержащий столбцы с целыми числами, символами и цифрами.Фактический набор данных намного больше, чем пример, приведенный ниже, но то, что ниже, является сносной и намного меньшей имитацией.
Я пытаюсь перебрать данные и изменить любые значения, превышающие mean + (3 * standard deviation)
именьше чем mean - (3 * standard deviation)
до NA
в числовых столбцах только .Если столбец содержит целое число или символ, цикл должен пропустить его и перейти к следующему столбцу.Кроме того, большинство столбцов уже содержат некоторые значения NA
и будут иметь множество значений, попадающих в mean +/- (3*sd)
.Эти ценности должны оставаться такими, какие они есть.
Конечная цель этого сценария - использовать его в будущих наборах данных с такой же структурой, и, хотя я открыт для предложений с пакетами, я хотел бы использовать циклы, если это возможно.Тем не менее, я далеко не эксперт в R и с удовольствием приму любой совет для меня!
Я разработал структуру для всего сценария, но он останавливается после первого оператора next
.
Сценарий:
data = data.frame(test_data)
for (i in colnames(data)){
if (class(data$i) == "numeric"){
m = mean(data$i, na.rm=TRUE)
sd = sd(data$i, na.rm=TRUE)
}
else
next
for (j in 1:nrow(data)){
if (data$i[j,] > (m + 3*sd)){
data$i[j,] <- NA
}
else if (data$i[j,] < (m - 3*sd)){
data$i[j,] <- NA
}
else
next
}
}
Используемые данныеЧтобы протестировать этот скрипт, выполните следующие действия:
Trait1 = c(1.1, 1.2, 1.35, 1.1, 1.2, NA, 1000, 1.5, 1.4, 1.6)
Trait2 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
Trait3 = c(125.1, 119.3, 118.4, NA, 1.1, 122.3, 123.4, 125.7, 121.5, 121.7)
test_data = data.frame(Trait1, Trait2, Trait3)
Заранее благодарю за любую помощь, которую вы можете предложить, я очень благодарен вам за это!