2017-09-17 34 views
2

我有一個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

因爲我有親戚幾個「夥伴的變量,我現在要創建空白行,用夥伴數據填寫它們。

+0

你打算如何來 「填充」你創建的空白行? – A5C1D2H2I1M1N2O1R2T1

+1

我認爲這是你的答案:https:// stackoverflow。com/questions/16453452/how-can-i-add-rows-to-an-r-data-frame-every-other-row – gst

+3

[我如何將行添加到每隔一行的R數據框? ](https://stackoverflow.com/questions/16453452/how-can-i-add-rows-to-an-r-data-frame-every-other-row) – gst

回答

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 

DATA

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

試試這個:

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") 
+1

@HannekeLettinga - 您的問題要求複製''id',但您的原始示例輸出顯示行名重複。我不確定你想要什麼,但是如果你想要ID值本身重複,其餘行空白,這將解決你的問題。否則,ycw在每個其他索引處創建完全空白的行都有很好的答案。 – www

+0

謝謝瑞恩。你是對的,我的原始樣本沒有顯示我真正想要的。感謝您澄清和迴應。當我嘗試運行你的代碼時,我得到一個錯誤,但我不直接理解:as.Date.numeric(value)中的錯誤:必須提供'origin'。我不知道日期問題來自哪裏,你有什麼想法嗎? – HannekeLettinga

+0

@HannekeLettinga - 嗨,不客氣。你是對的,這個錯誤通常發生在處理日期轉換時。這似乎很奇怪,它會彈出在這裏,因爲我的代碼不直接處理任何日期/類轉換。錯誤可能來自不同的原因。爲了幫助,我已經包含了一些可以用來進行小規模測試的示例數據。將我提供的樣本數據導入到R中後,請注意樣本數據中的列與sapply(df,class)的類別,並確保您的實際數據與樣本數據的類別匹配。這應該有所幫助。 – www

0

另一種選擇使用dplyr

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

或者你可以使用map_dfrpurrr

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