gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:47:26 25 4
gpt4 key购买 nike

我正在尝试 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com