dplyr中两个table()函数的等价物

时间:2017-04-03 10:39:45

标签: r dplyr

我有一个包含两个变量的列,我想按日期计算出现次数。

> testData
   plan_type       date
1 subscriber 2016-09-06
2 subscriber 2017-01-19
3 subscriber 2016-10-07
4        PPU 2017-01-19
5        PPU 2015-06-17
6        PPU 2015-07-03

我知道这可以通过例如通过子集化到两个不同的数据帧来完成 - 一个只有subscriber而另一个只有PPU数据,然后使用table()并绑定两个数据帧一起。但我想找到一个更有效的dplyr解决方案,可以在一个命令中执行此操作。

输出应该看起来像这样,NA值,其中一个变量没有数据。

> output 
        date subscriber  PPU
1 2015-06-17       <NA>    1
2 2015-07-03       <NA>    1
3 2016-09-06          1 <NA>
4 2016-10-07          1 <NA>
5 2017-01-19          1    1

是否有一个特定的公式可以在dplyr中执行此功能?

2 个答案:

答案 0 :(得分:1)

使用n,您可以创建新的常量列spread(),然后library(dplyr) library(tidyr) df %>% mutate(n = 1) %>% spread(plan_type, n) #> date PPU subscriber #> 1 2015-06-17 1 NA #> 2 2015-07-03 1 NA #> 3 2016-09-06 NA 1 #> 4 2016-10-07 NA 1 #> 5 2017-01-19 1 1

df <- read.table(text = '   plan_type       date
                 1 subscriber 2016-09-06
                 2 subscriber 2017-01-19
                 3 subscriber 2016-10-07
                 4        PPU 2017-01-19
                 5        PPU 2015-06-17
                 6        PPU 2015-07-03', header = T)

数据:

awk -F '[[:blank:]]*[|][[:blank:]]*' -v path="./" '
   NR==1 {
      for( i=1;i<5;i++) $i = ""
      h = $0; sub(/^[[:blank:]|]+/,"", h)
      next
      }

      {
      file= path $1 $2 "_" $3 "_" $4 "_03042017.csv"

      # remove 4 first field
      for( i=1;i<5;i++) $i = ""
      # cleaning starting space
      Cleaned = $0; sub( /^[[:blank:]|]+/, "", Cleaned)

      print ( a[file]++ ? "" : "DM9 03042017" ORS h ORS ) Cleaned > file
      }

   END {
      for(file in a) { print "EOF " a[file] > file }
      }
   ' YourFile

答案 1 :(得分:0)

使用data.table,我们可以使用dcast

library(data.table)
dcast(setDT(df), date~plan_type, length)
#         date PPU subscriber
#1: 2015-06-17   1          0
#2: 2015-07-03   1          0
#3: 2016-09-06   0          1
#4: 2016-10-07   0          1
#5: 2017-01-19   1          1