【问题标题】:combine rows in dataframe with vector constant将数据框中的行与向量常数结合起来
【发布时间】:2016-02-23 09:48:39
【问题描述】:

我有一个常量向量年和一个 data.frame。

> year <- c("2011","2012","2013","2014")
[1] "2011" "2012" "2013" "2014"

> data.frame
id   nome   year   value              
01   bob    2011   100 
02   alice  2012   210 
03   alice  2014   300
04   ted    2013   110  
05   ted    2011   240

然后我想将这个 data.frame 与向量值混合...

> new data.frame
id   nome   year   value              
01   bob    2011   100 
02   bob    2012   0
03   bob    2013   0
04   bob    2014   0
05   alice  2011   0 
06   alice  2012   210 
07   alice  2013   0 
08   alice  2014   300
09   ted    2011   240
10   ted    2012   0
11   ted    2013   110
12   ted    2014   0  

如果您在城市的特定年份不在线,则应将缺少的年份插入表中,重复除最后一个始终为零 (0) 的字段之外的所有其他字段。

我真正的问题是……

我有这个带有这个列和行的临时(数据框):

   siaf uf estado       municipio dtPub vlLiberado
1   643 AC   ACRE      ACRELANDIA  2011   873905.4
2   643 AC   ACRE      ACRELANDIA  2012   250000.0
3   643 AC   ACRE      ACRELANDIA  2013   311776.0
4   157 AC   ACRE    ASSIS BRASIL  2011        0.0
5   157 AC   ACRE    ASSIS BRASIL  2013   350000.0
6   157 AC   ACRE    ASSIS BRASIL  2014   200000.0
7   105 AC   ACRE       BRASILEIA  2011  1118075.7
8   105 AC   ACRE       BRASILEIA  2012  4277180.7
9   105 AC   ACRE       BRASILEIA  2013  4669340.0
10  105 AC   ACRE       BRASILEIA  2014   775000.0
11  645 AC   ACRE          BUJARI  2011        0.0
12  645 AC   ACRE          BUJARI  2013   300000.0
13  645 AC   ACRE          BUJARI  2014   823000.0
14  647 AC   ACRE        CAPIXABA  2011   317600.0
15  647 AC   ACRE        CAPIXABA  2012   300000.0
16  647 AC   ACRE        CAPIXABA  2013   146250.0
17  107 AC   ACRE CRUZEIRO DO SUL  2011 10563673.3
18  107 AC   ACRE CRUZEIRO DO SUL  2012 11187626.9
19  107 AC   ACRE CRUZEIRO DO SUL  2013  7976846.8
20  107 AC   ACRE CRUZEIRO DO SUL  2014  2203750.0

我需要运行统计时间序列,为此,我在 data.frame temp 中包含更多行,以便城市在 dtPub 字段中有 2011、2012、2013 和 2014 年的记录,并且包含的​​金额为零 (0) . 我需要下面这个结果...

   siaf uf estado       municipio dtPub vlLiberado
1   643 AC   ACRE      ACRELANDIA  2011   873905.4
2   643 AC   ACRE      ACRELANDIA  2012   250000.0
3   643 AC   ACRE      ACRELANDIA  2013   311776.0
    643 AC   ACRE      ACRELANDIA  2014        0.0   << code add this line 
4   157 AC   ACRE    ASSIS BRASIL  2011        0.0
    157 AC   ACRE    ASSIS BRASIL  2012        0.0   << code add this line
5   157 AC   ACRE    ASSIS BRASIL  2013   350000.0
6   157 AC   ACRE    ASSIS BRASIL  2014   200000.0
7   105 AC   ACRE       BRASILEIA  2011  1118075.7
8   105 AC   ACRE       BRASILEIA  2012  4277180.7
9   105 AC   ACRE       BRASILEIA  2013  4669340.0
10  105 AC   ACRE       BRASILEIA  2014   775000.0
11  645 AC   ACRE          BUJARI  2011        0.0
11  645 AC   ACRE          BUJARI  2012        0.0   << code add this line
12  645 AC   ACRE          BUJARI  2013   300000.0
13  645 AC   ACRE          BUJARI  2014   823000.0
14  647 AC   ACRE        CAPIXABA  2011   317600.0
15  647 AC   ACRE        CAPIXABA  2012   300000.0
16  647 AC   ACRE        CAPIXABA  2013   146250.0
16  647 AC   ACRE        CAPIXABA  2014        0.0      << code add this line
17  107 AC   ACRE CRUZEIRO DO SUL  2011 10563673.3
18  107 AC   ACRE CRUZEIRO DO SUL  2012 11187626.9
19  107 AC   ACRE CRUZEIRO DO SUL  2013  7976846.8
20  107 AC   ACRE CRUZEIRO DO SUL  2014  2203750.0

【问题讨论】:

  • 我没有看到你的混合算法。请在您的问题中提供更多信息。
  • 看来 OP 想用缺失的年份扩展数据。

标签: r


【解决方案1】:

新的tidyr 更新有一个方便的功能可以做到这一点。欲了解更多信息,请查看?complete

library(tidyr)
library(dplyr)
df %>% complete(nome, year, fill=list(value=0)) %>%
  mutate(id=sprintf("%02d", 1:n()))
# Source: local data frame [12 x 4]
# 
#      nome  year    id value
#    (fctr) (int) (chr) (dbl)
# 1   alice  2011    01     0
# 2   alice  2012    02   210
# 3   alice  2013    03     0
# 4   alice  2014    04   300
# 5     bob  2011    05   100
# 6     bob  2012    06     0
# 7     bob  2013    07     0
# 8     bob  2014    08     0
# 9     ted  2011    09   240
# 10    ted  2012    10     0
# 11    ted  2013    11   110
# 12    ted  2014    12     0

使用新数据:

library(tidyr)
complete(df, c(siaf,uf, estado, municipio), dtPub, fill=list(vlLiberado=0))
Source: local data frame [20 x 6]

    siaf     uf estado   municipio dtPub vlLiberado
   (int) (fctr) (fctr)      (fctr) (int)      (dbl)
1    105     AC   ACRE   BRASILEIA  2011  1118075.7
2    105     AC   ACRE   BRASILEIA  2012  4277180.7
3    105     AC   ACRE   BRASILEIA  2013  4669340.0
4    105     AC   ACRE   BRASILEIA  2014   775000.0
5    157     AC   ACRE ASSISBRASIL  2011        0.0
6    157     AC   ACRE ASSISBRASIL  2012        0.0
7    157     AC   ACRE ASSISBRASIL  2013   350000.0
8    157     AC   ACRE ASSISBRASIL  2014   200000.0
9    643     AC   ACRE  ACRELANDIA  2011   873905.4
10   643     AC   ACRE  ACRELANDIA  2012   250000.0
11   643     AC   ACRE  ACRELANDIA  2013   311776.0
12   643     AC   ACRE  ACRELANDIA  2014        0.0
13   645     AC   ACRE      BUJARI  2011        0.0
14   645     AC   ACRE      BUJARI  2012        0.0
15   645     AC   ACRE      BUJARI  2013   300000.0
16   645     AC   ACRE      BUJARI  2014   823000.0
17   647     AC   ACRE    CAPIXABA  2011   317600.0
18   647     AC   ACRE    CAPIXABA  2012   300000.0
19   647     AC   ACRE    CAPIXABA  2013   146250.0
20   647     AC   ACRE    CAPIXABA  2014        0.0

【讨论】:

  • 感谢您的关注,但我不了解代码。我在哪里引用我的数据框以及在哪里引用向量。我将粘贴我真正的问题。
  • complete我,tidyr
  • 我尝试了很多组合并收到错误... temp %>% complete(c(siaf, uf, estado, municipio), dtPub, fill=list(value=0)) @987654327 中的错误@(*tmp*, var, value = numeric(0)) : 替换有 0 行,数据有 24 Além disso: 警告信息: In is.na(data[[var]]) : is.na() aplicado a um objeto diferente de lista ou vetor de tipo 'NULL'
  • 如果您阅读了文档,您使用了list(value=0),该列表应该具有应该填充的列名。我使用了value,因为这就是您在示例中作为列名的名称。 list(vlLiberado=0)
  • 感谢您的聆听和耐心分析我的问题。有时我们会因为压力而失明。
猜你喜欢
  • 2021-07-25
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多