【问题标题】:Add blank rows in between existing rows在现有行之间添加空白行
【发布时间】:2017-09-17 09:43:11
【问题描述】:

我有一个包含 240 个案例的数据集,我想在每个现有行之后创建一个空白行。留下 480 行,其中一半已填充,另一半为空(然后我想自己填充一些数据)。

数据示例

  id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
1  3         1    1    1 1955-12-01 42.50000     1
2  5         1    1    1 1943-04-09 55.16667     1
3  7         1    1    1 1958-04-10 40.25000     1
4 10         1    1    1 1958-04-17 40.25000     1
5 12         1    1    2 1947-11-01 50.66667     1
6 14         1    1    2 1952-02-02 46.41667     1

理想情况下,应该复制“id”,如下所示:

    id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
1    3         1    1    1 1955-12-01 42.50000     1
2    3        NA   NA   NA         NA       NA    NA
3    5         1    1    1 1943-04-09 55.16667     1
4    5        NA   NA   NA         NA       NA    NA
5    7         1    1    1 1958-04-10 40.25000     1
6    7        NA   NA   NA         NA       NA    NA
7   10         1    1    1 1958-04-17 40.25000     1
8   10        NA   NA   NA         NA       NA    NA
9   12         1    1    2 1947-11-01 50.66667     1
10  12        NA   NA   NA         NA       NA    NA
11  14         1    1    2 1952-02-02 46.41667     1
12  14        NA   NA   NA         NA       NA    NA

我尝试使用以下代码复制所有行:

mydf_long <- mydf[rep(1:nrow(mydf), each = 2),]

但正如你所看到的,这甚至与我想要的结果相差甚远。

编辑: 感谢您的编辑和 cmets。我需要将原始数据转换为适合多级分析的格式。但是,数据仍然非常混乱,因此最初适用于我的一小部分数据的其他方法不适用于我的全部数据集。有关背景的更多信息,请参阅我的其他问题:

Reshape/gather function to create dataset ready for multilevel analysis

Tidy up and reshape messy dataset (reshape/gather/unite function)?

R - replace values by row given some statement in if loop with another value in same df

由于我有相对“很少”的合作伙伴变量,我现在想创建空白行,并用合作伙伴数据填充它们。

【问题讨论】:

标签: r dataframe


【解决方案1】:

我们可以复制每一行,然后将偶数行设置为NA

dt2 <- dt[rep(1:nrow(dt), each = 2), ]
dt2[1:nrow(dt2) %% 2 == 0, ] <- NA

head(dt2)
    id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
1    3         1    1    1 1955-12-01 42.50000     1
1.1 NA        NA   NA   NA       <NA>       NA    NA
2    5         1    1    1 1943-04-09 55.16667     1
2.1 NA        NA   NA   NA       <NA>       NA    NA
3    7         1    1    1 1958-04-10 40.25000     1
3.1 NA        NA   NA   NA       <NA>       NA    NA

数据

dt <- read.table(text = "  id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
1  3         1    1    1 1955-12-01 42.50000     1
2  5         1    1    1 1943-04-09 55.16667     1
3  7         1    1    1 1958-04-10 40.25000     1
4 10         1    1    1 1958-04-17 40.25000     1
5 12         1    1    2 1947-11-01 50.66667     1
6 14         1    1    2 1952-02-02 46.41667     1",
                 header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    试试这个:

    require(dplyr)
    
    df %>% 
      group_by(id) %>% 
      do(rbind(.,c(.$id,rep(NA,NCOL(df)-1)))) %>%
      ungroup() %>% data.frame()
    

    输出:

       id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
    1   3         1    1    1 1955-12-01 42.50000     1
    2   3        NA   NA   NA       <NA>       NA    NA
    3   5         1    1    1 1943-04-09 55.16667     1
    4   5        NA   NA   NA       <NA>       NA    NA
    5   7         1    1    1 1958-04-10 40.25000     1
    6   7        NA   NA   NA       <NA>       NA    NA
    7  10         1    1    1 1958-04-17 40.25000     1
    8  10        NA   NA   NA       <NA>       NA    NA
    9  12         1    1    2 1947-11-01 50.66667     1
    10 12        NA   NA   NA       <NA>       NA    NA
    11 14         1    1    2 1952-02-02 46.41667     1
    12 14        NA   NA   NA       <NA>       NA    NA
    

    样本数据:

    require(data.table)
    df <- fread("id groep_MNC zkhs fbeh    pgebdat    p_age pgesl
                  3         1    1    1 1955-12-01 42.50000     1
                  5         1    1    1 1943-04-09 55.16667     1
                  7         1    1    1 1958-04-10 40.25000     1
                 10         1    1    1 1958-04-17 40.25000     1
                 12         1    1    2 1947-11-01 50.66667     1
                 14         1    1    2 1952-02-02 46.41667     1")
    

    【讨论】:

    • @HannekeLettinga - 您的问题要求复制“id”,但您的原始示例输出显示重复的行名。我不确定您想要哪个,但如果您希望 ID 值本身重复,而行的其余部分为空白,这将解决您的问题。否则,ycw 有一个很好的答案,可以在每个其他索引处创建完全空白的行。
    • 谢谢瑞恩。你是对的,我的原始样本没有显示我真正想要的。感谢您的澄清和回复。当我尝试运行您的代码时,我得到一个错误,我不直接理解: as.Date.numeric(value) 中的错误:必须提供'origin'。不知道日期的问题出在哪里,你知道吗?
    • @HannekeLettinga - 嗨,不客气。你是对的,这个错误通常发生在处理日期转换时。它会出现在这里似乎很奇怪,因为我的代码不直接处理任何日期/类转换。错误可能来自不同的原因。为了提供帮助,我提供了一些示例数据,您可以使用这些数据进行小规模测试。将我提供的示例数据导入 R 后,使用 sapply(df,class) 记下示例数据中列的类,并确保您的真实数据与该示例数据的类匹配。这应该会有所帮助。
    【解决方案3】:

    另一个使用dplyr的选项:

    library(dplyr)
    df %>%
      split(df$id) %>%
      Map(rbind, ., NA) %>%
      do.call(rbind, .) %>%
      mutate(id = rep(df$id, each = 2))
    

    或者你可以使用map_dfr from purrr:

    library(purrr)
    df %>%
      group_by(id) %>%
      map_dfr(rbind, NA) %>%
      mutate(id = rep(df$id, each = 2))
    

    结果:

    # A tibble: 12 x 7
          id groep_MNC  zkhs  fbeh    pgebdat    p_age pgesl
       <int>     <int> <int> <int>      <chr>    <dbl> <int>
     1     3         1     1     1 1955-12-01 42.50000     1
     2     3        NA    NA    NA       <NA>       NA    NA
     3     5         1     1     1 1943-04-09 55.16667     1
     4     5        NA    NA    NA       <NA>       NA    NA
     5     7         1     1     1 1958-04-10 40.25000     1
     6     7        NA    NA    NA       <NA>       NA    NA
     7    10         1     1     1 1958-04-17 40.25000     1
     8    10        NA    NA    NA       <NA>       NA    NA
     9    12         1     1     2 1947-11-01 50.66667     1
    10    12        NA    NA    NA       <NA>       NA    NA
    11    14         1     1     2 1952-02-02 46.41667     1
    12    14        NA    NA    NA       <NA>       NA    NA
    

    【讨论】:

    • 很好的答案,我如何以及在哪里可以最好地掌握 purrr?小插曲?
    • @NelsonGon 小插曲是开始的好地方。我发现“咕噜声简介”(emoriebeck.github.io/R-tutorials/purrr)和备忘单也很有帮助(purrr.tidyverse.org
    • @NelsonGon 第一个链接实际上更多用于创建列列表和嵌套数据框。数据营中的这一课作为深入的概述可能更有用:datacamp.com/courses/…
    • 哦,谢谢。希望datacamp不使用视频教程。我发现阅读更容易。再次感谢!
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2018-06-22
    • 2018-11-15
    • 2020-04-08
    • 2020-12-19
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多