Создайте переменную, равную последнему-не значению NA для идентификатора другой переменной - PullRequest
0 голосов
/ 01 мая 2018

Мне нужна ваша помощь: у меня есть такой фрейм данных, как этот подраздел в data0 ниже.

data0 <- data.frame(id = c("AH001","AH001","AH002","AH002","AH002","AH002","AH003","AH003","AH003","AH003"),
                    numvisit = c(2,3,2,3,4,5,2,3,4,5), 
                    datvisit = c(25/06/2014,24/07/2014,25/06/2014,24/07/2014,25/08/2014,26/09/2014,25/06/2014,24/07/2014,25/08/2014,26/09/2014), 
                    weight = c(51.3,51.4,59.8,59.6,NA,NA,52.2,52.5,NA,NA), 
                    center = c(1,1,1,1,1,1,1,1,1,1))

Я хотел бы создать новую переменную "poidslast", которая будет последним не-NA значением переменной "poids" для каждой группы Id. Как и в том, что у меня здесь, в «ожидаемых данных»

dataexpected <- data.frame(id = c("AH001","AH001","AH002","AH002","AH002","AH002","AH003","AH003","AH003","AH003"),
                           numvisit = c(2,3,2,3,4,5,2,3,4,5),
                           datvisit = c(25/06/2014,24/07/2014,25/06/2014,24/07/2014,25/08/2014,26/09/2014,25/06/2014,24/07/2014,25/08/2014,26/09/2014), weight =c(51.3,51.4,59.8,59.6,NA,NA,52.2,52.5,NA,NA),
                           center = c(1,1,1,1,1,1,1,1,1,1),
                           lastweight = c(NA,51.4,NA,59.6,NA,NA,NA,52.5,NA,NA))

Я пробовал некоторые функции, такие как ave, aggregate, ... но ... Пожалуйста, помогите мне найти решение!

Screen shot of the dataframe

Теперь я хотел бы преобразовать мой фрейм данных в широкоформатный формат и иметь такие вещи: на этом снимке экрана "datawide" ==>

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете использовать fill из tidyr / tidyverse. Для любого столбца, который вы даете, он заполняет самое последнее не NA значение выше (для .direction = "down") или ниже (для .direction = "up"). Работает в сгруппированном фрейме данных.

library(tidyverse)

data0 %>%
    group_by(id) %>%
    fill(weight, .direction = "down")
#> # A tibble: 10 x 5
#> # Groups:   id [3]
#>    id    numvisit datvisit weight center
#>    <fct>    <dbl>    <dbl>  <dbl>  <dbl>
#>  1 AH001       2.  0.00207   51.3     1.
#>  2 AH001       3.  0.00170   51.4     1.
#>  3 AH002       2.  0.00207   59.8     1.
#>  4 AH002       3.  0.00170   59.6     1.
#>  5 AH002       4.  0.00155   59.6     1.
#>  6 AH002       5.  0.00143   59.6     1.
#>  7 AH003       2.  0.00207   52.2     1.
#>  8 AH003       3.  0.00170   52.5     1.
#>  9 AH003       4.  0.00155   52.5     1.
#> 10 AH003       5.  0.00143   52.5     1.

Создано в 2018-04-30 пакетом Представ. (v0.2.0).

0 голосов
/ 01 мая 2018

С data.table это один вкладыш:

setDT(data0)
data0[data0[!is.na(weight),.I[.N], id]$V1, lastweight := weight]

Пояснение:

1. data0[!is.na(weight),.I[.N], id]$V1 - Находит индекс последних не значений NA в каждой группе.
2. Затем мы используем эти значения индекса в позиции i и создаем новый столбец lastweight, принимая соответствующие значения weight по указанным индексам.

Больше объяснений:

1. .I, .N - специальные переменные, разработанные для библиотеки data.table. .I предоставляет порядковый номер для каждой строки. .N обеспечивает подсчет всех строк в группе. Вы можете найти больше информации об этом в официальной документации.
2. Итак, здесь data0[!is.na(weight),.I[.N], id]$V я просто группирую id, присваиваю номер каждой строке и нахожу номер последней строки, который не является na.
3. Постарайтесь сделать это поэтапно, и вы поймете это лучше.

Второй ответ:

В результате получается широкая форма, которую вы хотите, но не совсем соответствует вашему выводу. Вы должны проверить свои выходные данные еще раз и сообщить мне.

data0[, rid := seq_len(.N), id]

data1 <- dcast(data0, id + center + lastweight ~ rid, value.var = c('datvisit','weight'))
data1 <- data1[!is.na(datvisit_1)]

print(data1)

      id center lastweight  datvisit_1  datvisit_2  datvisit_3  datvisit_4 weight_1 weight_2 weight_3 weight_4
1: AH001      1       51.4          NA 0.001702369          NA          NA       NA     51.4       NA       NA
2: AH001      1         NA 0.002068851          NA          NA          NA     51.3       NA       NA       NA
3: AH002      1       59.6          NA 0.001702369          NA          NA       NA     59.6       NA       NA
4: AH002      1         NA 0.002068851          NA 0.001551639 0.001434404     59.8       NA       NA       NA
5: AH003      1       52.5          NA 0.001702369          NA          NA       NA     52.5       NA       NA
6: AH003      1         NA 0.002068851          NA 0.001551639 0.001434404     52.2       NA       NA       NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...