簡體   English   中英

創建一個變量,該變量等於每個變量的id的最后一個非NA值

[英]Create a variable equal to the last-non NA value per id of another variable

我需要您的幫助:我在下面的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”,該變量將是每個Id組變量“ poids” 的最后一個非NA值。 就像我在“ dataexpected”中的內容一樣

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,by ...但是...請幫助我找到解決方案!

數據框的屏幕截圖

現在,我想將數據轉換為寬格式,並進行如下操作: 在此屏幕快照中,圖片為“ datawide” ==>

預期為“數據范圍”格式

隨着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位置使用這些索引值,並通過在給定索引處獲取相應的weight值來創建新列lastweight

更多說明:

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

您可以使用filltidyr / tidyverse 對於您提供的任何列,它都會在(對於.direction = "down" )或以下(對於.direction = "up" )填充最新的非NA值。 它在分組數據幀內工作。

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.

reprex軟件包 (v0.2.0)創建於2018-04-30。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM