将2列与Datar的其余部分互换

将2列与Datar的其余部分互换,r,dataframe,pivot,R,Dataframe,Pivot,我有一个数据表: Country AcctType Instrument Stream Line sum period Afghanistan A 1 D CFD DD 133 August2019 Afghanistan B 2 E CFD DD 108

我有一个数据表:

Country    AcctType    Instrument    Stream        Line        sum           period
Afghanistan   A           1            D          CFD DD        133        August2019
Afghanistan   B           2            E          CFD DD        108        August2019
Afghanistan   A           3            E          CFD DD        108        September2019
Albania       A           1            D          CFD DD        374        August2019
Albania       B           2            D          CFD DD        400        September2019
我只想将sum和period列和group by country首先转换为以下列,以便输出如下所示:

Country    AcctType    Instrument    Stream        Line        August2019    September2019
Afghanistan   A           1            D          CFD DD        133               -
Afghanistan   A           3            E          CFD DD        108               -
Afghanistan   B           2            E          CFD DD         -               108       
Albania       A           1            D          CFD DD        374               -
Albania       B           2            D          CFD DD         -               400        
我知道有一种使用dcast的方法,但我找不到那么多有用的文档


任何帮助都将不胜感激。

一个快速解决方案是

library(tidyr)

df %>% 
  pivot_wider(
    names_from = period,
    values_from = sum
)

编辑:

#在另一个月添加一行
df%
支点更宽(
name_from=句点,
值\u from=sum
)
#一个tibble:6x8
#国家账户类型仪表流线2019年8月2019年9月2019年10月
#                                         
#阿富汗A 1 D CFD DD 133纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳
#阿富汗B 2 E CFD DD 108 NA
#阿富汗A 3东CFD DD NA 108 NA
#阿尔巴尼亚A 1 D CFD DD 374 NA
#阿尔巴尼亚B 2 D CFD DD NA 400 NA
#安道尔C1 D CFD DD NA 107

一个快速解决方案是

library(tidyr)

df %>% 
  pivot_wider(
    names_from = period,
    values_from = sum
)

编辑:

#在另一个月添加一行
df%
支点更宽(
name_from=句点,
值\u from=sum
)
#一个tibble:6x8
#国家账户类型仪表流线2019年8月2019年9月2019年10月
#                                         
#阿富汗A 1 D CFD DD 133 NA
#阿富汗B 2 E CFD DD 108 NA
#阿富汗A 3东CFD DD NA 108 NA
#阿尔巴尼亚A 1 D CFD DD 374 NA
#阿尔巴尼亚B 2 D CFD DD NA 400 NA
#安道尔C1 D CFD DD NA 107

我们可以使用
数据表中的
dcast

library(data.table)
dcast(setDT(df1), ... ~ period, value.var = 'sum')
#      Country AcctType Instrument Stream   Line August2019 September2019
#1: Afghanistan        A          1      D CFD DD        133            NA
#2: Afghanistan        A          3      E CFD DD         NA           108
#3: Afghanistan        B          2      E CFD DD        108            NA
#4:     Albania        A          1      D CFD DD        374            NA
#5:     Albania        B          2      D CFD DD         NA           400

我们可以使用
data.table中的
dcast

library(data.table)
dcast(setDT(df1), ... ~ period, value.var = 'sum')
#      Country AcctType Instrument Stream   Line August2019 September2019
#1: Afghanistan        A          1      D CFD DD        133            NA
#2: Afghanistan        A          3      E CFD DD         NA           108
#3: Afghanistan        B          2      E CFD DD        108            NA
#4:     Albania        A          1      D CFD DD        374            NA
#5:     Albania        B          2      D CFD DD         NA           400

非常感谢,这是一种享受,我给出的示例只是一个快照,实际上,表在这段时间内有更多的月份,使用您的脚本,它给出了我想要的输出,但日期不是按升序排列的,是否有一种方法可以指定?
pivot\u
按照pivotting变量(在本例中为
period
)上遇到类别的顺序创建月份列。我在上面的答案中给出了一个例子。因此,如果按时间顺序排列数据集,则应按时间顺序获得创建的列,如下所示well@r_mat还有,我不是乞求你,但是如果你觉得我的答案很有用,并且你已经对它投了更高的票,你能再次对它投上更高的票吗?因为在堆栈溢出上有一个问题:非常感谢,这很有效,我给出的示例只是一个快照,实际上,表在这段时间内有更多的月份,通过脚本,它给出了我想要的输出,但日期不是升序,是否有一种方法可以指定?
pivot\u
按照pivotting变量(在本例中为
period
)上遇到类别的顺序创建月份列。我在上面的答案中给出了一个例子。因此,如果按时间顺序排列数据集,则应按时间顺序获得创建的列,如下所示well@r_mat还有,我不是乞求你,但是如果你觉得我的答案很有用,并且你已经对它投了更高的票,你能再次对它投上更高的票吗?因为堆栈溢出存在以下问题: