具有多个相同条目(名称)的列,2具有差异数据的列需要散布成长格式

时间:2018-12-17 19:14:20

标签: r dplyr reshape

我的数据如下:

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,但没有看到预期的结果,需要进行回归分析,这是一个重要的参数。

任何想法做同样的事情都会受到赞赏。

3 个答案:

答案 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

在公式中,我们告诉函数namevariable是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