首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个相同条目的列(名称),有差异数据的2列需要扩展为长格式。

具有多个相同条目的列(名称),有差异数据的2列需要扩展为长格式。
EN

Stack Overflow用户
提问于 2018-12-17 19:14:20
回答 3查看 57关注 0票数 1

我有如下数据:

代码语言:javascript
复制
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

我必须每月公布数据(如以下所示)。

代码语言:javascript
复制
name  Feb-17   Mar-17  June-18
   a      10       12       14
   b      16       0        18

我面临的问题是,我也想以类似的方式调整balls.left,尝试用group_by,但没有看到预期的结果,需要运行回归和这是一个重要的参数。

任何这样做的想法都将受到高度赞赏。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-18 04:18:15

如果没有一个清晰的可重复的例子,我就不能确定,但我相信这样做可以实现您想要的结果:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-12-17 19:46:21

下面是使用reshape2的一个可能的解决方案。首先熔化表,使球的数量仅为一个变量,新的列描述了这两种类型中的哪一种。

让我们调用您的数据df

代码语言:javascript
复制
library(reshape2)
df1 <- melt(df)

然后将数据转换成单独的列。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-12-18 04:53:54

这是我建议的tidyverse解决方案:

代码语言:javascript
复制
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)

这产生了:

代码语言:javascript
复制
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

看来您只需要两行。在我看来,这似乎不太可能,因为名称并不是唯一的,除非您返回到一个广泛的格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53821665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档