Переместить строки, чтобы быть на одной высоте? - PullRequest
0 голосов
/ 06 апреля 2020

[demographic birth history data] (demographic birth histories)[1] На изображении выше показаны первые ~ 20 строк моего df.

Цель состоит в том, чтобы переместить строки 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 не всегда на 1 ниже v011).

## 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.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Мы можем использовать 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
1 голос
/ 06 апреля 2020

Мы можем использовать функцию 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
# ... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...