如何在生成tibble时保留各选项与对应占比的关联?
解决方法
问题根源
直接把prop.table(table(...))传入tibble()时,只会提取表格里的数值部分,丢失了作为行名的选项标签。要保留对应关系,需要先把表格的行名转为显式列,再转为tibble。
方案1:用as_tibble()的rownames参数(最简洁)
利用tibble::as_tibble()的rownames参数,直接将table的行名转为指定列:
library(tibble) # 先计算占比,再转成带选项列的tibble drinkchoice <- table(surveyq$drink_choice) %>% prop.table() %>% as_tibble(rownames = "Drink") %>% rename(Proportion = value) # 把默认的value列名改成更清晰的名称
方案2:用rownames_to_column()(对应你提到的方法)
如果想用rownames_to_column(),需要先把table转为保留行名的对象,再转换行名为列:
library(tibble) library(dplyr) drinkchoice <- table(surveyq$drink_choice) %>% prop.table() %>% as.data.frame() %>% # 先转成data.frame,此时行名是选项,列是Freq rownames_to_column("Drink") %>% # 将行名转为Drink列 rename(Proportion = Freq) %>% # 重命名占比列 as_tibble() # 转为tibble
方案3:用dplyr的count()+mutate()(更符合tidyverse风格)
绕开table,直接用tidyverse的函数流程计算,更直观:
library(dplyr) drinkchoice <- surveyq %>% count(drink_choice, name = "Count") %>% # 统计各选项的数量 mutate(Proportion = Count / sum(Count)) %>% # 计算占比 rename(Drink = drink_choice) # 重命名选项列
关于你提到的~ tibble::rownames_to_column("Drink")
你写的语法有误,~是公式语法,通常用在purrr或dplyr的特定场景中。正确用法是像方案2那样,把它作为管道中的一步直接调用rownames_to_column("Drink"),原行名会自动作为Drink列的内容,占比数值保留在另一列里,不需要手动重写数值。
内容的提问来源于stack exchange,提问作者RNewbie
相关产品推荐
相关产品推荐

