【问题标题】:Recoding multiple variables using tidyverse in R在 R 中使用 tidyverse 重新编码多个变量
【发布时间】:2023-04-06 22:09:01
【问题描述】:

可能是一个愚蠢的问题,我想在一个包含多个条件的小标题中重新编码多个变量。

数据示例:

library(tidyverse)
s <- matrix(sample(1:15, 20, replace = TRUE), ncol = 4)
s <- as_tibble(s)

这给出了这样的东西:

# A tibble: 5 x 4
     V1    V2    V3    V4
  <int> <int> <int> <int>
1    11     2     5    14
2     5     4    15     5
3    13    15     2     5
4     7    13    15    11
5    11     5    12     3

我想在此条件下重新编码 V1、V2、V3,并使 V4 保持不变: 如果值小于或等于 5 得到 1,如果值大于 5 但小于或等于 10 得到 2,最后如果值大于 10 得到 3。

输出应如下所示:

# A tibble: 5 x 4
         V1    V2    V3    V4
      <int> <int> <int> <int>
    1    3     1     1     14
    2    1     1     3      5
    3    3     3     1      5
    4    2     3     3     11 
    5    3     1     3      3

我知道 apply、sapply、vapply,但我想以优雅的方式使用 tidyverse 包中的函数重新编码。

提前致谢!

【问题讨论】:

  • 看看 dplyr 中的mutate_at。它旨在将相同的功能应用于您可以随意选择的多个列。

标签: r dplyr tidyverse recode


【解决方案1】:

要详细说明@MrFlick 评论,您可以将mutate_at 与dplyr 中的case_when 函数结合使用。它看起来像这样:

s %>% 
  mutate_at(vars(V1:V3), 
            function(x) case_when(x <= 5 ~ 1, x <= 10 ~ 2, TRUE ~ 3))

这会给你:

# A tibble: 5 x 4
     V1    V2    V3    V4
  <dbl> <dbl> <dbl> <int>
1     3     1     3     6
2     2     1     1     8
3     2     3     1    14
4     1     3     3    15
5     1     2     3     7

【讨论】:

  • 虽然您的 V4 列中有错字,但它有效!!!感谢您向我介绍 mutate_at 函数!!!
  • 错字在哪里?你指的是数字不同吗?如果是这样,那只是因为sample 在为我创建矩阵时使用了不同的数字,然后在你创建矩阵时使用了不同的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2018-08-08
相关资源
最近更新 更多