在R中按S.NO分组时,在收集数据的开始和结束时添加年龄NA

rhfm7lfc  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(112)

我有一个数据集,看起来像这样,我试图在为每个序列号收集的年龄数据的开始和结束处添加NA,如R中的预期数据集所示。将感谢任何帮助。谢谢。
| S.NO|年龄_1|年龄_2|
| - ------|- ------|- ------|
| 一百二十三|十九|二十四|
| 一百二十四|十八|二十一|
| 一百二十四|二十一|二十八|
| 一百二十四|二十八|三十五|
| 一百二十五|十三|十九|
| 一百二十五|十九|二十三|
| 一百二十六|十九|二十一|
预期数据集
| S.NO|年龄_1|年龄_2|
| - ------|- ------|- ------|
| 一百二十三|不适用|十九|
| 一百二十三|十九|二十四|
| 一百二十三|二十四|不适用|
| 一百二十四|不适用|十八|
| 一百二十四|十八|二十一|
| 一百二十四|二十一|二十八|
| 一百二十四|二十八|三十五|
| 一百二十四|三十五|不适用|
| 一百二十五|不适用|十三|
| 一百二十五|十三|十九|
| 一百二十五|十九|二十三|
| 一百二十五|二十三|不适用|
| 一百二十六|不适用|十九|
| 一百二十六|十九|二十一|
| 一百二十六|二十一|不适用|

hfyxw5xn

hfyxw5xn1#

使用tibble::add_rowdplyr::group_splitpurrr::map_dfr,您可以执行以下操作:

library(dplyr, warn = FALSE)
library(tibble)
library(purrr)

pad_rows <- function(x) {
  x |> 
    tibble::add_row(S.NO = first(x$S.NO), AGE_2 = first(x$AGE_1), .before = 1) |> 
    tibble::add_row(S.NO = last(x$S.NO), AGE_1 = last(x$AGE_2), .after = Inf)
}

dat |> 
  group_split(S.NO) |> 
  purrr::map_dfr(pad_rows)
#> # A tibble: 15 × 3
#>     S.NO AGE_1 AGE_2
#>    <int> <int> <int>
#>  1   123    NA    19
#>  2   123    19    24
#>  3   123    24    NA
#>  4   124    NA    18
#>  5   124    18    21
#>  6   124    21    28
#>  7   124    28    35
#>  8   124    35    NA
#>  9   125    NA    13
#> 10   125    13    19
#> 11   125    19    23
#> 12   125    23    NA
#> 13   126    NA    19
#> 14   126    19    21
#> 15   126    21    NA
    • 数据**
dat <- data.frame(
        S.NO = c(123L, 124L, 124L, 124L, 125L, 125L, 126L),
       AGE_1 = c(19L, 18L, 21L, 28L, 13L, 19L, 19L),
       AGE_2 = c(24L, 21L, 28L, 35L, 19L, 23L, 21L)
)
0yycz8jy

0yycz8jy2#

使用group_modify

library(dplyr)
library(tibble)
df %>% 
  group_by(S.NO) %>% 
  group_modify(~ .x %>% 
                add_row(AGE_2= first(.x$AGE_1), .before = 1) %>% 
                add_row(AGE_1 = last(.x$AGE_2))) %>% 
  ungroup
  • 输出
# A tibble: 15 × 3
    S.NO AGE_1 AGE_2
   <int> <int> <int>
 1   123    NA    19
 2   123    19    24
 3   123    24    NA
 4   124    NA    18
 5   124    18    21
 6   124    21    28
 7   124    28    35
 8   124    35    NA
 9   125    NA    13
10   125    13    19
11   125    19    23
12   125    23    NA
13   126    NA    19
14   126    19    21
15   126    21    NA
o4hqfura

o4hqfura3#

使用nest_by的方法

library(dplyr)
library(tidyr) # unnest

df %>% 
  nest_by(S.NO) %>% 
  mutate(data = list(unique(unlist(data)))) %>% 
  unnest(data) %>% 
  group_by(S.NO) %>% 
  reframe(AGE_1 = c(NA, data), AGE_2 = c(data, NA))
# A tibble: 15 × 3
    S.NO AGE_1 AGE_2
   <int> <int> <int>
 1   123    NA    19
 2   123    19    24
 3   123    24    NA
 4   124    NA    18
 5   124    18    21
 6   124    21    28
 7   124    28    35
 8   124    35    NA
 9   125    NA    13
10   125    13    19
11   125    19    23
12   125    23    NA
13   126    NA    19
14   126    19    21
15   126    21    NA
数据
df <- structure(list(S.NO = c(123L, 124L, 124L, 124L, 125L, 125L, 126L
), AGE_1 = c(19L, 18L, 21L, 28L, 13L, 19L, 19L), AGE_2 = c(24L, 
21L, 28L, 35L, 19L, 23L, 21L)), class = "data.frame", row.names = c(NA, 
-7L))

相关问题