传播列并复制行

时间:2019-07-26 11:42:07

标签: r dplyr tidyverse

我不知道我的问题标题是否有意义。我正在尝试编写代码,将计数替换为列的名称。例如,如果一个观察值的计数为2,则该观察值的ID变为2,但列名而不是计数。下表显示了我的解释不合理时想要的内容。

这是我的表格(代码):

df <- structure(list(ID = c("P40", "P41", "P43"), 
                     Fruit = c(2, 2, 1),
                     Snack = c(2, 1, 1)),
                class = "data.frame", row.names = c(NA, -3L))

表格:

ID    Fruit Snack
P40     2     2
P41     2     1
P43     1     1

This is what i want to achieve:
 ID  Items 
P40  Fruit    
P40  Fruit
P40  Snack
P40  Snack
P41  Fruit
P41  Fruit
P41  Snack
P43  Fruit         
P43  Snack

3 个答案:

答案 0 :(得分:3)

一个选择是gatheruncount

library(dplyr)
library(tidyr)

df %>%
  gather(key, value, -ID) %>%
  uncount(value)

#     ID   key
#1   P40 Fruit
#1.1 P40 Fruit
#2   P41 Fruit
#2.1 P41 Fruit
#3   P43 Fruit
#4   P40 Snack
#4.1 P40 Snack
#5   P41 Snack
#6   P43 Snack

答案 1 :(得分:0)

我们可以在base R中进行此操作,方法是unlist对齐除第一个列以外的所有列,然后rep将行序列与列的值相切以扩展数据 >

df1 <- data.frame(ID = df[,1], Items = unlist(df[-1], use.names = FALSE))
df1[rep(seq_len(nrow(df1)), df1$Items),]
#.    ID Items
#1   P40     2
#1.1 P40     2
#2   P41     2
#2.1 P41     2
#3   P43     1
#4   P40     2
#4.1 P40     2
#5   P41     1
#6   P43     1

答案 2 :(得分:0)

单线:

library(reshape2)

dd <- data.frame(ID = rep(melt(df)$ID, melt(df)$value),
           Items = rep(melt(df)$variable,melt(df)$value)
           )