Задача в l oop над строками с Lapply в r - PullRequest
0 голосов
/ 17 января 2020

Для кадра данных в следующем формате:

Name    Surename    A   B   C   D   E   F   G   H   I   J   K   L   
John    Rose        2   3   4   5   3   4   5   6   80  3   3   0
Smith   Red         4   5   2   4   5   5   2   4   4   0   3   56
Karl    Joe         2   33  4   44  3   4   0   6   80  3   2   5

Как применить laaply для запуска кода ниже для каждой строки (столбец A: L) и добавить в конце новый столбец каждого ряда как «Новый».

H <-  3 * IQR(x, na.rm = T)
out1 <- round(median(x) - H)
out2 <- round(median(x) + H)
x[x < out1] <- out1
x[x > out2] <- out2
x$`New` <- round(mean(x)))

Таким образом, ожидаемый результат будет следующим:

Name    Surename    A   B   C   D   E   F   G   H   I   A   B   C   New
John    Rose        2   3   4   5   3   4   5   6   80  3   3   0   4.4
Smith   Red         4   5   2   4   5   5   2   4   4   0   3   56  4.3
Karl    Joe         2   33  4   44  3   4   0   6   80  3   2   5   14.5

1 Ответ

2 голосов
/ 17 января 2020

Вы можете создать функцию

change_outlier <- function(x) {
   H <-  3 * IQR(x, na.rm = T)
   out1 <- round(median(x) - H)
   out2 <- round(median(x) + H)
   x[x < out1] <- out1
   x[x > out2] <- out2
   mean(x)
}

и применять ее по строкам.

df$new <- apply(df[-c(1:2)], 1, change_outlier)
df
#   Name Surename A  B C  D E F G H  I J K  L   new
#1  John     Rose 2  3 4  5 3 4 5 6 80 3 3  0  4.00
#2 Smith      Red 4  5 2  4 5 5 2 4  4 0 3 56  4.08
#3  Karl      Joe 2 33 4 44 3 4 0 6 80 3 2  5 10.83

данные

df <- structure(list(Name = structure(c(1L, 3L, 2L), .Label = c("John", 
"Karl", "Smith"), class = "factor"), Surename = structure(3:1, .Label = c("Joe", 
"Red", "Rose"), class = "factor"), A = c(2L, 4L, 2L), B = c(3L, 
5L, 33L), C = c(4L, 2L, 4L), D = c(5L, 4L, 44L), E = c(3L, 5L, 
3L), F = c(4L, 5L, 4L), G = c(5L, 2L, 0L), H = c(6L, 4L, 6L), 
I = c(80L, 4L, 80L), J = c(3L, 0L, 3L), K = c(3L, 3L, 2L), 
L = c(0L, 56L, 5L)), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...