【问题标题】:create a function to change format of variables in R创建一个函数来更改 R 中变量的格式
【发布时间】:2020-07-15 18:49:50
【问题描述】:

我想创建一个健壮的函数来创建我在 R 中的data.table 中的某些列的格式。我希望它尽可能健壮,因为我将在不同的数据集上使用它,我目前存在不同的不一致在数据中。示例数据如下:

此函数的目标是两个检查data.table 中的两列:groupcategory。他们本来就是性格。我想对它们进行变异:

组变量应该是一个因子,并且只包含级别ABU。其他一切都应该是U

类似地,变量category 应该是一个因素,并且只包含级别ECHS。任何空单元格或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_groupallowed 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


【解决方案1】:

要进行条件替换,您应该使用第一个维度。使用data.table 操作:=(通过引用更新),您无需重新分配值。我假设您要放置的 NA 在 groupcategory 中。我认为使用 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

【讨论】:

  • 我已在问题中添加了所需的输出(我应该在开头添加以进行澄清)
  • 你的回答几乎是想要的,虽然我不确定为什么会创建一个名为 .SD 的额外列?还有B在category列,其实不是“允许值”
  • 我想我尝试的东西太复杂了。我的编辑是否与您正在寻找的解决方案相对应?
  • 几乎,但不完全。对于group,如果字符串不是“允许值”之一,则会得到U。然而,在category 观察中,n.25 最初是“c”并变成“CH”,尽管“C”不包含在“允许值”的向量中。这怎么可能?
猜你喜欢
  • 1970-01-01
  • 2018-05-29
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多