0

[人口出生史数据](人口出生史)[1] 上图显示了我的 df 的前 20 行。

目标是将 b3_01 - b3_10 行移动到与 v011 列中具有数字的行相同的高度。例如,caseid #4 是妈妈,case 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

We can use na.locf from 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 回答
1

我们可以使用包中的fill函数tidyr。首先,我们填写 的缺失值v011,然后我们在分组后填写剩余的列v011。填写缺失值v011是必要的,因为它是我们分组的变量。如果您需要保留它的缺失,您可以创建列的副本 ( v011_copy)。

library(dplyr)
library(tidyverse)

d %>%
    fill(v011, .direction = "down") %>%
    group_by(v011) %>%
    fill(-caseid, -v008, -v011, .direction = "up")

#    caseid  v008  v011 b3_01 b3_02 b3_03
#     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#  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
# ... 
于 2020-04-06T19:45:31.520 回答