简体   繁体   English

根据R中的条件在数据框中重复行

[英]Repeat rows in a dataframe based on a condition in R

I have a dataframe that looks like this: 我有一个看起来像这样的数据框:

STAND Plot1 X    DBH   Spec   HT              NOTES
1   TEN YEAR VAR RET     1 s   1.25    ASH   NA                   
2   TEN YEAR VAR RET     1 s   1.25    ASH   NA                   
3   TEN YEAR VAR RET     1 s   1.25    ASH   NA                   
4   TEN YEAR VAR RET     1 s   1.25    ASH   NA                   
5   TEN YEAR VAR RET     1 s   1.25    ASH   NA                   

I need to repeat a block of rows a number of times (different number for different blocks). 我需要重复一个行块多次(不同块的数量不同)。 So I have a stand (STAND) and 5*2 plots in each stand. 因此,我有一个展位(STAND),每个展位都有5 * 2的地块。 5 plots are small (X = "s"), and another 5 are large (X = "L"). 5个地块较小(X =“ s”),另外5个地块较大(X =“ L”)。 I need to duplicate rows for each large plot 20 times, and each small plot 500 times. 我需要为每个大图重复20次,每个小图重复500次。 So the condition for the block to be repeated would be something like this: 因此,要重复执行该块的条件如下:

STAND == "TEN YEAR VAR RET", Plot1 == "1", X == "s"  * 500
STAND == "TEN YEAR VAR RET", Plot1 == "2", X == "s"  * 500 etc

And for the large plot if would be something like: 对于大块情节,它会是这样的:

STAND == "TEN YEAR VAR RET", Plot1 == "1", X == "L"  * 20
STAND == "TEN YEAR VAR RET", Plot1 == "2", X == "L"  * 20 etc

Any advice is appreciated! 任何建议表示赞赏!

We could create some numeric index of the rows 我们可以为行创建一些数字索引

#row index with 's' value for X
i1 <- with(df1, which(STAND == "TEN YEAR VAR RET" & Plot1 %in%  c("1", "2")& X == "s"))
#row index for 'L' value for X
i2 <- with(df1, which(STAND == "TEN YEAR VAR RET" & Plot1 %in%  c("1", "2")& X == "L"))
#row index for those that doesn't belong to the above 2
i3 <- which(!seq_len(nrow(df1)) %in% c(i1, i2))

and then replicate the rows to expand the dataset 然后复制行以扩展数据集

n1 <- 500
n2 <- 20
df2 <- df1[sort(c(rep(i1, each =  n1), i3, rep(i2, each = n2))),]

data 数据

df <- read.table(text="
             STAND Plot1 X    DBH   Spec   HT
'TEN YEAR VAR RET'     1 s   1.25    ASH   NA                   
'TEN YEAR VAR RET'     2 s   1.25    ASH   NA                   
'TEN YEAR VAR RET'     2 L   1.25    ASH   NA                   
'TEN YEAR VAR RET'     1 s   1.25    ASH   NA                   
'TEN YEAR VAR RET'     3 L   1.25    ASH   NA                   
'AAAAAAAAAAAAAAAA'     2 s   1.25    ASH   NA                   
'AAAAAAAAAAAAAAAA'     3 s   1.25    ASH   NA                   
'TEN YEAR VAR RET'     2 s   1.25    ASH   NA",stringsAsFactors=F,header=T)

Solution

library(dplyr)
library(tidyr)
library(magrittr)

df %>%
  mutate(times=case_when(
    Plot1 == 1 ~ 2, # <- change values (and possibly condition) here
    Plot1 == 2 ~ 3, # <- and here
    TRUE ~ 1)) %>%
  group_by(times) %>%
  nest %$%
  map2_dfr(data,times,~.x[rep(seq(nrow(.x)),each=.y),])

# A tibble: 18 x 6
#               STAND Plot1     X   DBH  Spec    HT
#               <chr> <int> <chr> <dbl> <chr> <lgl>
#  1 TEN YEAR VAR RET     1     s  1.25   ASH    NA
#  2 TEN YEAR VAR RET     1     s  1.25   ASH    NA
#  3 TEN YEAR VAR RET     1     s  1.25   ASH    NA
#  4 TEN YEAR VAR RET     1     s  1.25   ASH    NA
#  5 TEN YEAR VAR RET     2     s  1.25   ASH    NA
#  6 TEN YEAR VAR RET     2     s  1.25   ASH    NA
#  7 TEN YEAR VAR RET     2     s  1.25   ASH    NA
#  8 TEN YEAR VAR RET     2     L  1.25   ASH    NA
#  9 TEN YEAR VAR RET     2     L  1.25   ASH    NA
# 10 TEN YEAR VAR RET     2     L  1.25   ASH    NA
# 11 AAAAAAAAAAAAAAAA     2     s  1.25   ASH    NA
# 12 AAAAAAAAAAAAAAAA     2     s  1.25   ASH    NA
# 13 AAAAAAAAAAAAAAAA     2     s  1.25   ASH    NA
# 14 TEN YEAR VAR RET     2     s  1.25   ASH    NA
# 15 TEN YEAR VAR RET     2     s  1.25   ASH    NA
# 16 TEN YEAR VAR RET     2     s  1.25   ASH    NA
# 17 TEN YEAR VAR RET     3     L  1.25   ASH    NA
# 18 AAAAAAAAAAAAAAAA     3     s  1.25   ASH    NA

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM