我的数据如下:
name date balls.purchased balls.left
a feb-17 10 5
a Mar-17 12 4
a June-18 14 6
b Feb-17 16 1
b June-18 18 7
我必须每月分发一次数据,例如下面
name Feb-17 Mar-17 June-18
a 10 12 14
b 16 0 18
问题是,我还想以类似的方式调整balls.left
,并尝试使用group_by,但没有看到预期的结果,需要进行回归分析,这是一个重要的参数。
任何想法做同样的事情都会受到赞赏。
答案 0 :(得分:1)
这是reshape2
的可能解决方案。首先将表格融化,以使球的数量仅是一个变量,然后在新列中描述两种类型中的哪一种。
让我们致电您的数据df
library(reshape2)
df1 <- melt(df)
然后投射数据以将月份分别放在单独的列中。
dcast(df1, name + variable ~ date)
# name variable feb-17 Feb-17 June-18 Mar-17
#1 a balls.purchased 10 NA 14 12
#2 a balls.left 5 NA 6 4
#3 b balls.purchased NA 16 18 NA
#4 b balls.left NA 1 7 NA
在公式中,我们告诉函数name
和variable
是ID变量,而date
的条目将是值变量。
答案 1 :(得分:1)
这是我建议的tidyverse解决方案:
library(tidyverse)
df<-read.table(text="name date balls.purchased balls.left
a Feb-17 10 5
a Mar-17 12 4
a June-18 14 6
b Feb-17 16 1
b June-18 18 7",header=T)
df %>%
gather("id","value",3:4) %>%
spread(date,value)
这将产生:
name id Feb-17 June-18 Mar-17
1 a balls.left 5 6 4
2 a balls.purchased 10 14 12
3 b balls.left 1 7 NA
4 b balls.purchased 16 18 NA
似乎只需要两行。我认为这似乎不太可能,因为除非您返回宽格式,否则名称不是唯一的。
答案 2 :(得分:0)
没有一个明确的可复制示例,我不确定,但是我相信这可以满足您的要求:
dd <- tibble::tribble(
~name, ~date, ~balls.purchased, ~balls.left,
'a', 'Feb-17', 10, 5,
'a', 'Mar-17', 12, 4,
'a', 'June-18', 14, 6,
'b', 'Feb-17', 16, 1,
'b', 'June-18', 18, 7
)
library(dplyr)
library(tidyr)
dd %>%
gather(key, value, -name, -date) %>%
unite('key', date, key) %>%
spread(key, value, fill = 0)
# A tibble: 2 x 7
name `Feb-17_balls.left` `Feb-17_balls.purchased` `June-18_balls.left` `June-18_balls.purchased` `Mar-17_balls.left` `Mar-17_balls.purchased`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 a 5 10 6 14 4 12
2 b 1 16 7 18 0 0