创建一个等于另一个变量的每个id的last-non NA值的变量

时间:2018-04-30 23:23:10

标签: r dataframe

我需要你的帮助:我在下面的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))

我想创建一个新变量&#34; poidslast&#34;这将是变量&#34; poids&#34;的最后一个非NA 值。对于每个Id组。正如我在这里所做的那样&#34; dataexpected&#34;

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 ...但...... 请帮我找一个解决方案!

Screen shot of the dataframe

现在,我希望以宽格式转换我的数据框,并提供类似的内容:此屏幕截图中的&#34;数据范围&#34; ==&gt;

"datawide" format expected

2 个答案:

答案 0 :(得分:3)

使用glGetUniformLocation(),这是一个班轮:

data.table

<强>解释

1. setDT(data0) data0[data0[!is.na(weight),.I[.N], id]$V1, lastweight := weight] - 查找每个组中最后一个非NA值的索引。
2.接下来,我们在data0[!is.na(weight),.I[.N], id]$V1位置使用这些索引值,并通过在给定索引处获取相应的i值来创建新列lastweight

更多说明:

1. weight.I是为data.table库设计的特殊变量。 .N为每行提供一个序号。 .I提供组中所有行的计数。您可以在官方文档中找到有关这些的更多信息。
2.所以,这里.N我只是组合data0[!is.na(weight),.I[.N], id]$V,给每一行写一个数字,找到最后一行非na的数字。
3.尝试逐步完成此操作,您将更好地理解它。

第二回答:

这会产生您想要的宽广形状,但不会与您的输出完全匹配。您应该再次检查输出并告诉我。

id

答案 1 :(得分:0)

您可以使用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.

reprex package(v0.2.0)创建于2018-04-30。