r - 如何在 R(或 excel)中执行这种独特的整形?

标签 r excel dataframe reshape

我正在尝试 reshape 数据框,但该任务与典型的 reshape 完全不同,我无法完全改变它。该表最初是在 excel 中,但我已经导入到 R,因此我可以在任一软件中使用解决方案。

我有一个包含名称、值和月份的数据框 donors:

NAME    AMT    MONTH
brett   100    jan
brett   100    mar
brett   100    nov
brett   50     apr
brett   50     jun
jane    75     dec
sam     200    jan
sam     200    feb
sam     200    mar

我需要重新调整此数据框的形状,以便每个月都有一个 NAME 列、一个 AMT 列和一个列。每行对应于在名称和数量上都是唯一的任何观察值,月份列是二进制变量(如果捐赠者/数量组合在那个月发生,则为 1,否则为 0。

所以上面的例子可以得出:

NAME   AMT   JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
brett  100   1   0   1   0   0   0   0   0   0   0   1   0
brett  50    0   0   0   1   0   1   0   0   0   0   0   0
jane   75    0   0   0   0   0   0   0   0   0   0   0   1
sam    200   1   1   1   0   0   0   0   0   0   0   0   0

如果您想完成我的代码,请创建一个等于 NAME/AMT 组合出现的总次数的最后一列(恰好等于月份列的总和)...但我可以自己做,如果您没有感觉。

谢谢!

最佳答案

这是一个 tidyverse 尝试 -

  • complete 以创建缺少月份的行。
  • 排列,使列的顺序正确。
  • 使用 pivot_wider 获取宽格式数据。
library(dplyr)
library(tidyr)

df %>%
  complete(MONTH = tolower(month.abb)) %>%
  arrange(match(MONTH, tolower(month.abb))) %>%
  pivot_wider(names_from = MONTH, values_from = MONTH, 
              values_fn = length, values_fill = 0) %>%
  na.omit

#  NAME    AMT   jan   feb   mar   apr   may   jun   jul   aug   sep   oct   nov   dec
#  <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 brett   100     1     0     1     0     0     0     0     0     0     0     1     0
#2 sam     200     1     1     1     0     0     0     0     0     0     0     0     0
#3 brett    50     0     0     0     1     0     1     0     0     0     0     0     0
#4 jane     75     0     0     0     0     0     0     0     0     0     0     0     1

请注意,month.abb 是内置的 R 向量,它提供缩写的月份名称。我使用 tolower(month.abb) 将其与数据中的实际列名相匹配。

数据

df <- structure(list(NAME = c("brett", "brett", "brett", "brett", "brett", 
"jane", "sam", "sam", "sam"), AMT = c(100L, 100L, 100L, 50L, 
50L, 75L, 200L, 200L, 200L), MONTH = c("jan", "mar", "nov", "apr", 
"jun", "dec", "jan", "feb", "mar")), 
class = "data.frame", row.names = c(NA, -9L))

关于r - 如何在 R(或 excel)中执行这种独特的整形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70304688/

相关文章:

R 错误 : Shadow graphics device error

r - 在 r 中使用 ggplot2 划分条形图各部分之间的线

r - XLConnect loadWorkbook 错误 - POIXMLException (Java)

r - 绑定(bind)两个具有不同列名的数据框

r - 使用 dplyr 在数据导入中仅保留一个唯一列

r - 平滑密度图,使其不会出现锯齿状

r - 使用 powerCurve(simr 包)进行功耗分析会产生令人困惑的输出

python - 如何在 Python 中打开 Microsoft Excel 中的 csv 文件?

excel - 使用单元格引用导出 XLS 文件

python - 有没有办法在 MultiIndex 列上应用函数?