создать функцию для изменения формата переменных в R - PullRequest
1 голос
/ 03 апреля 2020

Я хочу создать robuust-функцию для создания формата некоторых столбцов в моем data.table в R. Я хочу, чтобы это было как можно более надежным, так как я буду использовать его в разных наборах данных, что, по моему мнению, в настоящее время вызывает несоответствия. в данных. Ниже приведены примерные данные:

Цель этой функции - два контрольных двух столбца в data.table: group и category. Они изначально персонажи. Я хочу изменить их так, чтобы:

Переменная группы должна быть фактором и состояла только из уровней A, B и U. Все остальное должно быть U.

Аналогично переменная category должна быть фактором и должна состоять только из уровней E, CH и S. Любые пустые ячейки или NA должны быть E. Все остальное NA.

Мои исходные данные состоят из многих десятков тысяч строк, поэтому я ищу подходящее решение для больших данных, в идеале data.table

rm(iris)
iris
group <-rep(c("a", "b", "C", "x", "A", "b", " ", "b", NA , "c"), times = 15) # A,B,U
category <-rep(c("e", "E", "CH", "Ch", "ch", "S", " ", "b", NA , "c"), times = 15) # E, CH, S
iris <- cbind(iris, group, category) 
iris <- iris[1:25,]
setDT(iris)

levels(iris$group) = list( U = "", F = "F", M = "M", U = "U")
levels(iris$category) = list( E = "", CH = "CH", E = "E", S = "S")

Я пробовал это следующим образом : 1) указать допустимые значения, 2) изменить все значения на заглавные, независимо от того, разрешены они или нет (в идеале это можно сделать с помощью одной из apply функций в data.table с использованием .SD, но я не имею выяснили, как это все же работает) 3) заменить все значения, которые не указаны в allowed_group или allowed category на NA

allowed_group <- c("U", "A", "B")
allowed_category <- c("E", "CH", "S")

iris$group <- toupper(iris$group)
iris$category <- toupper(iris$category)

iris[,!(group == allowed_group | category == allowed_category)] <- NA

исходные данные:

> iris
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species group category
1           5.1         3.5          1.4         0.2  setosa     a        e
2           4.9         3.0          1.4         0.2  setosa     b        E
3           4.7         3.2          1.3         0.2  setosa     C       CH
4           4.6         3.1          1.5         0.2  setosa     x       Ch
5           5.0         3.6          1.4         0.2  setosa     A       ch
6           5.4         3.9          1.7         0.4  setosa     b        S
7           4.6         3.4          1.4         0.3  setosa               
8           5.0         3.4          1.5         0.2  setosa     b        b
9           4.4         2.9          1.4         0.2  setosa  <NA>     <NA>
10          4.9         3.1          1.5         0.1  setosa     c        c
11          5.4         3.7          1.5         0.2  setosa     a        e
12          4.8         3.4          1.6         0.2  setosa     b        E
13          4.8         3.0          1.4         0.1  setosa     C       CH
14          4.3         3.0          1.1         0.1  setosa     x       Ch
15          5.8         4.0          1.2         0.2  setosa     A       ch
16          5.7         4.4          1.5         0.4  setosa     b        S
17          5.4         3.9          1.3         0.4  setosa               
18          5.1         3.5          1.4         0.3  setosa     b        b
19          5.7         3.8          1.7         0.3  setosa  <NA>     <NA>
20          5.1         3.8          1.5         0.3  setosa     c        c
21          5.4         3.4          1.7         0.2  setosa     a        e
22          5.1         3.7          1.5         0.4  setosa     b        E
23          4.6         3.6          1.0         0.2  setosa     C       CH
24          5.1         3.3          1.7         0.5  setosa     x       Ch
25          4.8         3.4          1.9         0.2  setosa     A       ch

желаемый результат:

> iris
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species group category
1           5.1         3.5          1.4         0.2  setosa     A        E
2           4.9         3.0          1.4         0.2  setosa     B        E
3           4.7         3.2          1.3         0.2  setosa     C       CH
4           4.6         3.1          1.5         0.2  setosa     U       CH
5           5.0         3.6          1.4         0.2  setosa     A       CH
6           5.4         3.9          1.7         0.4  setosa     B        S
7           4.6         3.4          1.4         0.3  setosa     U        E
8           5.0         3.4          1.5         0.2  setosa     B     <NA>
9           4.4         2.9          1.4         0.2  setosa     U        E
10          4.9         3.1          1.5         0.1  setosa     U     <NA>
11          5.4         3.7          1.5         0.2  setosa     A        E
12          4.8         3.4          1.6         0.2  setosa     B        E
13          4.8         3.0          1.4         0.1  setosa     C       CH
14          4.3         3.0          1.1         0.1  setosa     U       CH
15          5.8         4.0          1.2         0.2  setosa     A       CH
16          5.7         4.4          1.5         0.4  setosa     B        S
17          5.4         3.9          1.3         0.4  setosa     U        E
18          5.1         3.5          1.4         0.3  setosa     B     <NA>
19          5.7         3.8          1.7         0.3  setosa     U        E
20          5.1         3.8          1.5         0.3  setosa     U     <NA>
21          5.4         3.4          1.7         0.2  setosa     A        E
22          5.1         3.7          1.5         0.4  setosa     B        E
23          4.6         3.6          1.0         0.2  setosa     C       CH
24          5.1         3.3          1.7         0.5  setosa     U       CH
25          4.8         3.4          1.9         0.2  setosa     A       CH

1 Ответ

0 голосов
/ 03 апреля 2020

Чтобы сделать условную замену, вы должны использовать первое измерение. При операции data.table := (обновление по ссылке) вам не нужно переназначать значения. Я предположил, что НС, которые вы хотели поставить, были в group и category. Я не думаю, что использование переменной factor помогает в вашем воспроизводимом примере. Однако, если ваши реальные данные демонстрируют факторы, вы можете преобразовать их в символы до шага перекодирования.

iris
group <-rep(c("a", "b", "C", "x", "A", "b", " ", "b", NA , "c"), times = 15) # A,B,U
category <-rep(c("e", "E", "CH", "Ch", "ch", "S", " ", "b", NA , "c"), times = 15) # E, CH, S
iris <- cbind(iris, group, category) 
iris <- iris[1:25,]
setDT(iris)

allowed_group <- c("U", "A", "B")
allowed_category <- c("E", "CH", "S")

iris[,c("group","category") := lapply(.SD, toupper),
     .SDcols = c("group","category")]

Теперь условные замены. Я использую пошаговую переменную, проще в обращении, чем мой слишком сложный первый ответ:

iris[!(group %in% allowed_group), group := "U"]
iris[!(category %in% allowed_category), category := "E"]

, что дает:

iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species group category
 1:          5.1         3.5          1.4         0.2  setosa     A        E
 2:          4.9         3.0          1.4         0.2  setosa     B        E
 3:          4.7         3.2          1.3         0.2  setosa     U       CH
 4:          4.6         3.1          1.5         0.2  setosa     U       CH
 5:          5.0         3.6          1.4         0.2  setosa     A       CH
 6:          5.4         3.9          1.7         0.4  setosa     B        S
 7:          4.6         3.4          1.4         0.3  setosa     U        E
 8:          5.0         3.4          1.5         0.2  setosa     B        E
 9:          4.4         2.9          1.4         0.2  setosa     U        E
10:          4.9         3.1          1.5         0.1  setosa     U        E
11:          5.4         3.7          1.5         0.2  setosa     A        E
12:          4.8         3.4          1.6         0.2  setosa     B        E
13:          4.8         3.0          1.4         0.1  setosa     U       CH
14:          4.3         3.0          1.1         0.1  setosa     U       CH
15:          5.8         4.0          1.2         0.2  setosa     A       CH
16:          5.7         4.4          1.5         0.4  setosa     B        S
17:          5.4         3.9          1.3         0.4  setosa     U        E
18:          5.1         3.5          1.4         0.3  setosa     B        E
19:          5.7         3.8          1.7         0.3  setosa     U        E
20:          5.1         3.8          1.5         0.3  setosa     U        E
21:          5.4         3.4          1.7         0.2  setosa     A        E
22:          5.1         3.7          1.5         0.4  setosa     B        E
23:          4.6         3.6          1.0         0.2  setosa     U       CH
24:          5.1         3.3          1.7         0.5  setosa     U       CH
25:          4.8         3.4          1.9         0.2  setosa     A       CH
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species group category
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...