在现有行

时间:2017-09-17 09:43:12

标签: r dataframe

我有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),]

但正如你所看到的那样,这与我最终想要的结果并不相符。

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

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

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

3 个答案:

答案 0 :(得分:4)

我们可以复制每一行,然后将行数与偶数行设置为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)

答案 1 :(得分: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")

答案 2 :(得分:1)

使用dplyr的另一个选项:

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

或者您可以使用map_dfr中的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