0

[人口統計出生履歴データ] (人口統計出生履歴)[1] 上の画像は、私の df の最初の ~20 行を示しています。

目標は、b3_01 ~ b3_10 行を移動して、v011 列に番号を持つ行と同じ高さにすることです。たとえば、ケース ID #4 は母親で、ケース ID #5 と 6 は彼女の子供です。1297の両方が973の隣にあることを望みます.

私は困惑しています!

structure(list(caseid = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), v008 = c(1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417), v011 = c(1081, NA, NA, 973, NA, NA, NA, 709, NA, NA, NA, 1045, NA, NA, NA, 877, NA, NA, NA, 685), b3_01 = c(NA, NA, NA, NA, 1297, NA, NA, NA, 1189, NA, NA, NA, NA, 1405, NA, NA, NA, NA, 1297, NA), b3_02 = c(NA, NA, NA, NA, NA, 1297, NA, NA, NA, NA, NA, NA, 1393, NA, NA, NA, NA, 1225, NA, NA), b3_03 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1189, NA, NA, NA), b3_04 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_05 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_06 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_07 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_08 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_09 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), b3_10 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

これまでのところ、b3_01-b3_10 の値を上げようとしましたが、それらは常に同じ距離であるとは限りません (たとえば、b3_01 は常に v011 よりも 1 小さいとは限りません)。

## Not the solution, but nice try  
      hello4 <- hello4 %>% 
        mutate_at(c("b3_01"), funs(lead), n = 1)

      hello4 <- hello4 %>% 
        mutate_at(c("b3_02"), funs(lead), n = 2)

      hello4 <- hello4 %>% 
        mutate_at(c("b3_03"), funs(lead), n = 3)

      etc.
4

2 に答える 2

1

na.locfから使用できますzoo

library(data.table)
library(zoo)
nm1 <- setdiff(names(d), c("caseid", "v008", "v011"))
setDT(d)[, v011 := na.locf0(v011)]
d[,  (nm1) :=  lapply(.SD, na.locf0, fromLast = TRUE), 
         v011, .SDcols = nm1]
d[, 1:6]
#    caseid v008 v011 b3_01 b3_02 b3_03
# 1:      1 1417 1081    NA    NA    NA
# 2:      2 1417 1081    NA    NA    NA
# 3:      3 1417 1081    NA    NA    NA
# 4:      4 1417  973  1297  1297    NA
# 5:      5 1417  973  1297  1297    NA
# 6:      6 1417  973    NA  1297    NA
# 7:      7 1417  973    NA    NA    NA
# 8:      8 1417  709  1189    NA    NA
# 9:      9 1417  709  1189    NA    NA
#10:     10 1417  709    NA    NA    NA
#11:     11 1417  709    NA    NA    NA
#12:     12 1417 1045  1405  1393    NA
#13:     13 1417 1045  1405  1393    NA
#14:     14 1417 1045  1405    NA    NA
#15:     15 1417 1045    NA    NA    NA
#16:     16 1417  877  1297  1225  1189
#17:     17 1417  877  1297  1225  1189
#18:     18 1417  877  1297  1225    NA
#19:     19 1417  877  1297    NA    NA
#20:     20 1417  685    NA    NA    NA
于 2020-04-06T19:53:15.797 に答える