【问题标题】:Melting two sets of two columns into two rows (one row for each column in the set) [duplicate]将两组两列融合成两行(集合中每一列一行)[重复]
【发布时间】:2020-04-11 04:26:13
【问题描述】:

我有一个data.table如下:

DT <- fread(
"ID country year Event_A Event_B Event_A_succ Event_B_succ
4   NLD   2002  0   1   0   0
5   NLD   2002  0   1   0   1
6   NLD   2006  1   1   1   1
7   NLD   2006  1   0   1   0
8   NLD   2006  1   1   0   0
9   GBR   2002  0   1   0   0
10  GBR   2002  0   0   0   0
11  GBR   2002  0   1   0   1
12  GBR   2006  1   1   1   1
13  GBR   2006  1   1   0   1",
header = TRUE)

我想将Event_X AND Event_X_succ 列投射到行上,而不将它们相加,从而创建新行。

我了解到here,我可以为Event_AEvent_B 执行以下操作:

library(data.table)
melt(DT, id.var = setdiff(names(DT), c("Event_A", "Event_B")), 
          value.name = 'Event')[, variable := NULL][order(ID)]

或(@IceCreamToucan):

melt(DT, measure.vars = c("Event_A", "Event_B"), value.name = 'Event')[, variable := NULL][order(ID)]

但我想添加第二个值名称 Event_succ 基于另外两列称为 Event_A_SuccEvent_B_Succes 并以相同的方式传播它们。

期望的输出:

DT <- fread(
"ID country year Event Event_succ
4   NLD   2002  0   0
4   NLD   2002  1   0
5   NLD   2002  0   0
5   NLD   2002  1   1
6   NLD   2006  1   1
6   NLD   2006  1   1
7   NLD   2006  1   1
7   NLD   2006  0   0
8   NLD   2006  1   0
8   NLD   2006  0   0
9   GBR   2002  1   0 
9   GBR   2002  1   0
10  GBR   2002  0   0
10  GBR   2002  0   0
11  GBR   2002  0   0
12  GBR   2002  1   0
13  GBR   2006  1   1
14  GBR   2006  1   1
15  GBR   2006  1   0
16  GBR   2006  1   1",
header = TRUE)

我应该如何解决这个问题?

【问题讨论】:

  • 查看 tidyr 包中的 pivot_longer。它具有做你想做的事情的功能

标签: r data.table transpose melt


【解决方案1】:

我们可以使用measurepatterns

melt(DT, measure = patterns("Event_[AB]$", "Event_[AB]_succ"), 
     value.name =  c("Event", "Event_succ"))[, variable :=  NULL][order(ID)]
#    ID country year Event Event_succ
# 1:  4     NLD 2002     0          0
# 2:  4     NLD 2002     1          0
# 3:  5     NLD 2002     0          0
# 4:  5     NLD 2002     1          1
# 5:  6     NLD 2006     1          1
# 6:  6     NLD 2006     1          1
# 7:  7     NLD 2006     1          1
# 8:  7     NLD 2006     0          0
# 9:  8     NLD 2006     1          0
#10:  8     NLD 2006     1          0
#11:  9     GBR 2002     0          0
#12:  9     GBR 2002     1          0
#13: 10     GBR 2002     0          0
#14: 10     GBR 2002     0          0
#15: 11     GBR 2002     0          0
#16: 11     GBR 2002     1          1
#17: 12     GBR 2006     1          1
#18: 12     GBR 2006     1          1
#19: 13     GBR 2006     1          0
#20: 13     GBR 2006     1          1

【讨论】:

  • 具有相同的解决方案,但 [, variable := NULL][order(ID)][order(ID), !"variable"] 相同
猜你喜欢
  • 2019-03-25
  • 2017-03-30
  • 2021-01-23
  • 2018-10-14
  • 1970-01-01
  • 2018-08-12
  • 2019-09-22
  • 2015-06-20
  • 2017-08-18
相关资源
最近更新 更多