![](/img/trans.png)
[英]Create new variable that is 0 until the first non-NA value of another variable, then 1 thereafter (within a group)
[英]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
您可以使用fill
從tidyr
/ 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.