【问题标题】:Pivoting Long Data to Wide data with Counts and Percentages in R使用 R 中的计数和百分比将长数据转换为宽数据
【发布时间】:2021-09-09 05:48:14
【问题描述】:

我需要获取一组从长格式到宽格式的数据,显示计数和相对百分比。下面是一些与我的情况类似的虚拟数据:

df <-tibble::tribble(
                  ~YEAR,                    ~Volunteers, ~retained,   ~n, ~Rel.Percentage,
                            2016,                            "LA",       "N",  51,                             "7%",
                            2016,                            "LA",       "Y", 685,                            "93%",
                            2017,                   "Victorville",       "N",  12,                            "16%",
                            2017,                   "Victorville",       "Y",  66,                            "84%",
                            2018,                 "Inland Empire",       "N",  33,                            "13%",
                            2018,                 "Inland Empire",       "Y", 227,                            "87%",
                            2019,                   "Kern County",       "N",   5,                             "7%",
                            2019,                   "Kern County",       "Y",  69,                            "93%",
                            2020,                       "Military",       "N",  61,                            "20%",
                            2020,                       "Military",       "Y", 243,                            "80%",
                            2017,                            "LA",       "N",  59,                             "7%",
                            2017,                            "LA",       "Y", 645,                            "93%",
                            2016,                   "Victorville",       "N",  15,                            "16%",
                            2016,                   "Victorville",       "Y",  64,                            "84%",
                            2019,                 "Inland Empire",       "N",  32,                            "13%",
                            2019,                 "Inland Empire",       "Y", 221,                            "87%",
                            2017,                   "Kern County",       "N",   7,                             "7%",
                            2017,                   "Kern County",       "Y",  73,                            "93%",
                            2016,                       "Military",       "N",  63,                            "20%",
                            2016,                       "Military",       "Y", 241,                            "80%"
                  )


wide.test <-df %>%
  pivot_wider(names_from = YEAR, values_from = c(`Rel.Percentage`) ) 

这给出了一个带有 NA 的偏移表,但我希望数字和相对百分比并排显示。

new.wide <-df[, !(names(df) %in% c("n"))] %>%
  pivot_wider(names_from = YEAR, values_from = `Rel.Percentage`)

这给了我一个更整洁的百分比表,但不显示 n

我也试过了:


newer.wide <-df %>%
  pivot_wider(names_from = YEAR, values_from = c(`Rel.Percentage`, n) )


但这个解决方案的问题是 n 现在位于它们自己的列集上,这使得这在很大程度上难以理解。如果可能的话,我希望将这些数字与它们的相对百分比放在一起,在括号中显示相对百分比旁边的基础数字。

【问题讨论】:

  • 不确定您是否已经将您的数据作为tribble,但如果您只是为这个示例制作了它,请查看dput 函数,它会打印您的数据,以便任何人都可以复制粘贴它。
  • 我的错,我只是为了这个例子。数据最初是一个数据框,你认为我应该转换它还是保留它的格式? tbh 我将在创建此宽格式后立即将其导出到 LaTeX 文件中
  • 好吧,我的意思更多是为了方便您。 dput 生成一个字符串,您可以将其复制粘贴到您的问题中。然后任何人都可以将其复制到他们的R 会话中。我个人更喜欢tibble 而不是data.frame。打印更干净,并且具有其他功能,例如nesting(请参阅tidyr::nest)。如果您正在制作 LaTeX 表格,我建议您查看 xtable 包。这旨在将 R 中的数据转换为 LaTeX 中的表格。
  • 谢谢你,我会考虑使用 tibbles!

标签: r dataframe data-manipulation


【解决方案1】:

在数据透视之前处理您的数据。使用 paste0(df$n, " (", df$Rel.Percentage, "%)") 之类的东西创建一个新变量,然后在 values_from 参数中使用该变量。

编辑: 让它更像一个完整的例子:

#this pastes the characters into the "fixed" column with both n and the percentage
df$fixed <- paste0(df$n, " (", df$Rel.Percentage, ")")

#this creates the table in a wide format with percentages across the years, while dropping the unnecessary columns for a cleaner look
df.wide <-df[, !(names(df) %in% c("n","Rel.Percentage"))] %>%
  pivot_wider(names_from = YEAR, values_from =fixed )

因此,可以将其导出到 LaTeX 表格中,以便于编写报告:

print(xtable(df.wide, type = "latex"), file = "df_wide.tex")

【讨论】:

  • 这个解决方案会维护索引吗?我不希望在错误的年份或志愿者中出现错误的百分比/n's
  • 实际上你的回答给了我错误:Error: Can't subset columns that don't exist.
  • @BenjaminDiaz 会的。 df$neat &lt;- paste0(df$n, " (", df$Rel.Percentage, " %)") 对我有用,你可以看到它们是如何匹配的。
  • 您能否将您的回复编辑成一个工作示例?如果是这样,我会给你“答案”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多