如何使用R转换以下数据帧

时间:2013-08-23 13:17:06

标签: r

我使用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

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

2 个答案:

答案 0 :(得分: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'参数指定(作为字符串)要用作值的变量。

答案 1 :(得分: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