用分类变量重复行数据不同的次数

时间:2016-08-02 23:56:06

标签: r dataframe

我有一个如下所示的数据框:

DATE    SURVEY  SPECIES COUNT
07/12/16    13  Paka    1
07/12/16    14  Paka    1
07/12/16    15  Grouper 2
07/12/16    16  Grouper 3
07/12/16    18  Grouper 1
07/12/16    20  Lehi    3

其中'Count'是每次给定调查所观察到的人数。我想重新整形数据,以便每个人都有一行(记录):例如:

DATE    SURVEY  SPECIES
07/12/16    13  Paka
07/12/16    14  Paka
07/12/16    15  Grouper
07/12/16    15  Grouper
07/12/16    16  Grouper
07/12/16    16  Grouper
07/12/16    16  Grouper
07/12/16    18  Grouper
07/12/16    20  Lehi
07/12/16    20  Lehi
07/12/16    20  Lehi

根据需要将每次调查的数据复制多次。我考虑过使用melt()或summarize()函数,但因为COUNT变量的范围是1到10而被卡住了。

由于

2 个答案:

答案 0 :(得分:1)

假设原始数据框为dat,您可以执行以下操作以获得所需的数据框new_dat

new_dat <- dat[rep.int(1:nrow(dat), dat$COUNT), -4]
rownames(new_dat) <- 1:nrow(new_dat)

键是行索引向量rep.int(1:nrow(dat), dat$COUNT),而-4仅表示丢弃第4列,即列COUNT

<强>测试

x <- "DATE    SURVEY  SPECIES COUNT
      07/12/16    13  Paka    1
      07/12/16    14  Paka    1
      07/12/16    15  Grouper 2
      07/12/16    16  Grouper 3
      07/12/16    18  Grouper 1
      07/12/16    20  Lehi    3"

dat <- read.table(text = x, header = TRUE)

#DATE   SURVEY  SPECIES COUNT
#07/12/16   13  Paka    1
#07/12/16   14  Paka    1
#07/12/16   15  Grouper 2
#07/12/16   16  Grouper 3
#07/12/16   18  Grouper 1
#07/12/16   20  Lehi    3

new_dat <- dat[rep.int(1:nrow(dat), dat$COUNT), -4]
rownames(new_dat) <- 1:nrow(new_dat)

#        DATE SURVEY SPECIES
#1   07/12/16     13    Paka
#2   07/12/16     14    Paka
#3   07/12/16     15 Grouper
#4   07/12/16     15 Grouper
#5   07/12/16     16 Grouper
#6   07/12/16     16 Grouper
#7   07/12/16     16 Grouper
#8   07/12/16     18 Grouper
#9   07/12/16     20    Lehi
#10  07/12/16     20    Lehi
#11  07/12/16     20    Lehi

答案 1 :(得分:1)

以下是expandRows

的另一个选项
library(splitstackshape)
`row.names<-`(expandRows(df1, "COUNT"), NULL)
#      DATE SURVEY SPECIES
#1  07/12/16     13    Paka
#2  07/12/16     14    Paka
#3  07/12/16     15 Grouper
#4  07/12/16     15 Grouper
#5  07/12/16     16 Grouper
#6  07/12/16     16 Grouper
#7  07/12/16     16 Grouper
#8  07/12/16     18 Grouper
#9  07/12/16     20    Lehi
#10 07/12/16     20    Lehi
#11 07/12/16     20    Lehi