【问题标题】:Dplyr: Rename Tibble Output Columns With Factor LevelsDplyr:使用因子级别重命名小标题输出列
【发布时间】:2020-05-11 15:24:50
【问题描述】:

我正在尝试找到一种方法,在 dplyr tibble 输出中将我的因子级别(1、2、3)重命名为女孩、男孩和其他。

这是代码:

library(dplyr)
df1 %>%
dplyr::group_by(sex)%>%
dplyr::summarise(percent=100*n()/nrow(df1), n=n())

我的结果是:

# A tibble: 3 x 3
  sexs    percent    n
   <int>   <dbl> <int>
1      1  52.1     731
2      2  47.1     661
3     NA   0.855    12

期望的结果是:

# A tibble: 3 x 3
      sexs    percent    n
       <int>   <dbl> <int>
Girl     1  52.1     731
Boy      2  47.1     661
Other   NA   0.855    12

【问题讨论】:

  • 这些是row_names/row.names 不是级别。你能用dput(head(df,n))添加你的数据吗?

标签: r dplyr


【解决方案1】:

我碰巧喜欢forcats 包,因为当我完成后,我实际上可以看到我做了什么。另一种解决方案,只需在现有代码之前添加到管道。

library(dplyr)
library(forcats)

sex <- sample(1:2, 100, replace = TRUE)
sex[[88]] <- NA
df1 <- data.frame(sex)

df1 %>% 
  mutate(newsex = fct_explicit_na(fct_recode(as_factor(sex), 
                                             Girl = "1", 
                                             Boy = "2" ), 
                                  na_level = "Other")) %>% 
  group_by(newsex, sex) %>%
  summarise(percent = 100 * n() / nrow(df1), n=n())
#> # A tibble: 3 x 4
#> # Groups:   newsex [3]
#>   newsex   sex percent     n
#>   <fct>  <int>   <dbl> <int>
#> 1 Girl       1      56    56
#> 2 Boy        2      43    43
#> 3 Other     NA       1     1

reprex package (v0.3.0) 于 2020-05-11 创建

【讨论】:

    【解决方案2】:

    发布时请提供一些示例数据以供使用,这将有助于其他人测试并确保一切正常。这个问题比较简单,所以应该不是问题。

    如果你想用任何其他数字替换 NA,你可以这样做

    df1 %>%
        dplyr::mutate(sex = ifelse(is.na(sex), 0, sex),
                      sex = factor(sex, 
                                   levels = c(1,2,0), 
                                   labels = c("Girl", "Boy", "Other"))) %>% 
        dplyr::group_by(sex)%>%
        dplyr::summarise(percent=100*n()/nrow(df1), n=n())
    

    否则您可以使用 case_when 分配因子,然后将列转换为因子

     df1 %>%
      dplyr::mutate(sex = case_when(
                                    sex == 1 ~ "Girl",
                                    sex == 2 ~ "Boy",
                                    is.na(sex) ~ "Other") %>% 
      as_factor(.)) %>% 
      dplyr::group_by(sex)%>%
      dplyr::summarise(percent=100*n()/nrow(df1), n=n())
    

    【讨论】:

    • 不幸的是,我正在处理的数据是机密的。你能告诉我在哪里可以找到包含性别变量的免费样本数据集,我可以分享吗?
    • 我不知道哪里有,但测试集中不存在的数据集可能存在细微差别。有什么方法可以共享一个未识别的子集,甚至是一个由数字组成的子集?你试过运行这些 sn-ps 吗?他们应该工作
    • 这两个选项都像一个魅力,正是我正在寻找的。非常感谢!
    • 有没有办法保持原来的排名,防止tibble按字母顺序排列?
    • 你的意思是按女孩、男孩、其他的顺序?在第一个示例中,如果您对 3 以外的代码进行编码,然后在汇总后 arrange(sex) 它应该保持顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多