2

我正在使用 R 生成过去 6 个月的统计报告。我有一个要求,如下所述:

输入数据框:

 FY_Qtr       region     Lic_type    revenue
 2009 Q1         AP       NCV       126.67
 2010 Q1         NA       NCV       395.80
 2011 Q1         LA       NCV       469.10
 2012 Q1         EMEA     MR        173.85
 2013 Q1         JAPAN    MR        140.24

预期数据:

  FY_Qtr       AP.NCV   NA.NCV   LA.NCV   EMEA.MR JAPAN.MR
 2009 Q1       126.67   -           -       -       -
 2010 Q1        -       395.80      -       -       -
 2011 Q1        -       -           469.10  -       -
 2012 Q1        -       -           -       173.85  -
 2013 Q1        -       -           -       -       140.24

任何人都可以帮助我获得预期数据吗?

4

2 回答 2

6

这正是构建“reshape2”包的任务类型。

设置:让我们加载示例数据。

data <- read.table(text="
     FY_Qtr       region     Lic_type    revenue
     '2009 Q1'         'AP'       NCV       126.67
     '2010 Q1'         'NA'       NCV       395.80
     '2011 Q1'         'LA'       NCV       469.10
     '2012 Q1'         'EMEA'     MR        173.85
     '2013 Q1'         'JAPAN'    MR        140.24
    ", header=TRUE)

投射数据:基本上你现在拥有的被认为是“融化”的数据。对于每组变量组合和分配的值,您都有一个带有单独行的 ID 列。这意味着您可以跳过通常的“reshape2”步骤,首先熔化数据并直接跳到铸造,如下所示:

library(reshape2)

dcast(data, FY_Qtr ~ region + Lic_type, value.var='revenue')

#    FY_Qtr AP_NCV EMEA_MR JAPAN_MR LA_NCV NA_NCV
# 1 2009 Q1 126.67      NA       NA     NA     NA
# 2 2010 Q1     NA      NA       NA     NA  395.8
# 3 2011 Q1     NA      NA       NA  469.1     NA
# 4 2012 Q1     NA  173.85       NA     NA     NA
# 5 2013 Q1     NA      NA   140.24     NA     NA

我们正在使用“dcast”函数,因为我们想要输出一个数据帧。然后,我们将您的融化数据指定为输入。下一部分说明如何关联数据,“~”等式的左侧指定 ID (FY_Qtr),“~”的右侧指定要使用的列变量组合。然后,“value.var”参数指定(作为字符串)要用作值的变量。

于 2013-08-23T13:40:10.840 回答
2

+1 给@Dinre;这是一个很好的解决方案,值得学习reshape2。如果您想了解如何在基础 R 中完成此操作,这并不难:

data <- read.table(text="FY_Qtr       region     Lic_type    revenue
                      '2009 Q1'         'AP'       NCV       126.67
                      '2010 Q1'         'NA'       NCV       395.80
                      '2011 Q1'         'LA'       NCV       469.10
                      '2012 Q1'         'EMEA'     MR        173.85
                      '2013 Q1'         'JAPAN'    MR        140.24", 
                   header=TRUE)


expected_data           <- matrix(NA, nrow=5, ncol=5)
rownames(expected_data) <- data$FY_Qtr
colnames(expected_data) <- with(data, paste(region, Lic_type, sep="."))
diag(expected_data)     <- data$revenue
expected_data
        AP.NCV NA.NCV LA.NCV EMEA.MR JAPAN.MR
2009 Q1 126.67     NA     NA      NA       NA
2010 Q1     NA  395.8     NA      NA       NA
2011 Q1     NA     NA  469.1      NA       NA
2012 Q1     NA     NA     NA  173.85       NA
2013 Q1     NA     NA     NA      NA   140.24
于 2013-08-24T03:03:40.810 回答