Я хочу создать 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