我有一个包含两个变量的列,我想按日期计算出现次数。
> 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
中执行此功能?
答案 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