【发布时间】:2020-07-15 18:49:50
【问题描述】:
我想创建一个健壮的函数来创建我在 R 中的data.table 中的某些列的格式。我希望它尽可能健壮,因为我将在不同的数据集上使用它,我目前存在不同的不一致在数据中。示例数据如下:
此函数的目标是两个检查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 函数之一来完成987654339@ 使用.SD,但我还没有弄清楚它是如何工作的)3)用NA 替换所有未在allowed_group 或allowed category 中指定的值
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
【问题讨论】:
-
我仍然不清楚你的目标。你想在“数万列”中重新编码一些级别?你想做点别的吗?你能说得更清楚些吗?
-
@linog 我说的是“数万行”:)
-
对不起,我看错了 ;) 不过,我很乐意提供更多详细信息来帮助您。您需要重新编码因子水平吗?
-
操作是什么,检查 data.frame 是否有这些列,并且它们的格式是否正确并返回 TRUE/FALSE?
-
@linog @sindri_baldur 显然我没有很好地提出这个问题,因此我对其进行了编辑。我想用 NA 替换现在允许的所有值,假设 iris$group 中的空值属于
U并且 iris$category 中的空值属于E。格式(字符或因子)实际上并不重要,因为它可以在以后轻松更改 - 如果我错了,请纠正我?
标签: r function data.table factors