R:从先前存在的数据帧创建新行

R: create new rows from preexistent dataframe

我想根据数据集中已有行的值创建新行。有两个问题:首先,一些单元格值需要保持不变,而其他单元格值必须增加 +1。其次,我需要在每一行中循环相同的次数。

我觉得用数据会更容易理解

这是我的起点:

mydata <- data.frame(id=c(10012000,10012002,10022000,10022002),
                     col1=c(100,201,44,11),
                     col2=c("A","C","B","A"))

这是我想要的:

mydata2 <- data.frame(id=c(10012000,10012001,10012002,10012003,10022000,10022001,10022002,10022003),
                     col1=c(100,100,201,201,44,44,11,11),
                     col2=c("A","A","C","C","B","B","A","A"))

请注意我如何在每个新行的 id 列单元格中添加 +1,但 col1 和 col2 保持不变。

谢谢

我认为应该这样做:

library(dplyr)
df1 <- arrange(rbind(mutate(mydata, id = id + 1), mydata), id, col2)

给出:

        id col1 col2
1 10012000  100    A
2 10012001  100    A
3 10012002  201    C
4 10012003  201    C
5 10022000   44    B
6 10022001   44    B
7 10022002   11    A
8 10022003   11    A
library(tidyverse)

mydata |> 
  mutate(id = map(id, \(x) c(x, x+1))) |> 
  unnest(id)
#> # A tibble: 8 × 3
#>         id  col1 col2 
#>      <dbl> <dbl> <chr>
#> 1 10012000   100 A    
#> 2 10012001   100 A    
#> 3 10012002   201 C    
#> 4 10012003   201 C    
#> 5 10022000    44 B    
#> 6 10022001    44 B    
#> 7 10022002    11 A    
#> 8 10022003    11 A

reprex package (v2.0.1)

于 2022-04-14 创建

您可以使用 tidyverse 方法:

library(dplyr)
library(tidyr)

mydata %>% 
  group_by(id) %>% 
  uncount(2) %>% 
  mutate(id = first(id) + row_number() - 1) %>% 
  ungroup()

这个returns

# A tibble: 8 x 3
        id  col1 col2 
     <dbl> <dbl> <chr>
1 10012000   100 A    
2 10012001   100 A    
3 10012002   201 C    
4 10012003   201 C    
5 10022000    44 B    
6 10022001    44 B    
7 10022002    11 A    
8 10022003    11 A 

在 base R 中,出于怀旧的原因:

mydata2 <- as.data.frame(lapply(mydata, function(col) rep(col, each = 2)))
mydata2$id <- mydata2$id + 0:1
library(data.table)
setDT(mydata)
final <- setorder(rbind(copy(mydata), mydata[, id := id + 1]), id)
#          id col1 col2
# 1: 10012000  100    A
# 2: 10012001  100    A
# 3: 10012002  201    C
# 4: 10012003  201    C
# 5: 10022000   44    B
# 6: 10022001   44    B
# 7: 10022002   11    A
# 8: 10022003   11    A