【问题标题】:R data.table Creating simple custom function [duplicate]R data.table创建简单的自定义函数[重复]
【发布时间】:2020-11-19 11:30:57
【问题描述】:

我目前正在使用 R 研究一个看起来有点像以下的数据集(除了它包含数百万行和更多变量):

pid     agedays    wtkg    htcm    bmi     haz    waz    whz 
1       2          1.92    44.2    9.74    -2.72  -3.23  NA             
1       29         2.68    49.2    11.07   -2.21  -3.03  -2.00                
1       61         3.63    52.0    13.42   -2.49  -2.62  -0.48        
1       89         4.11    55.0    13.59   -2.20  -2.70  -1.14
2       1          2.40    48.1    10.37   -0.65  -1.88  -2.54          
2       28         3.78    53.1    13.41   -0.14  -0.58  -0.79
2       56         4.53    55.2    14.87   -0.68  -0.74  -0.18                 
2       104        5.82    61.3    15.49    0.23  -0.38  -0.70 

我正在创建一个函数,其中添加了以下变量: haz_1.5、waz_1.5、whz_1.5、htcm_1.5、wtkg_1.5 和 bmi_1.5

每个变量都将遵循以下相同的标准模式: !is.na(haz) and agedays > 61-45 and agedays

新的数据集应该如下所示(除了 bmi_1.5、wtkg_1.5 和 htcm_1.5 从下面的输出中省略,因此表格样本可以放入框内):

pid         agedays    wtkg    htcm    bmi     haz    waz    whz    haz_1.5    waz_1.5    whz_1.5
    1       2          1.92    44.2    9.74    -2.72  -3.23  NA     NA         NA         NA          
    1       29         2.68    49.2    11.07   -2.21  -3.03  -2.00  -2.21      -3.03      -2.00              
    1       61         3.63    52.0    13.42   -2.49  -2.62  -0.48  NA         NA         NA       
    1       89         4.11    55.0    13.59   -2.20  -2.70  -1.14  NA         NA         NA 
    2       1          2.40    48.1    10.37   -0.65  -1.88  -2.54  NA         NA         NA          
    2       28         3.78    53.1    13.41   -0.14  -0.58  -0.79  -0.14      -0.58      -0.79
    2       56         4.53    55.2    14.87   -0.68  -0.74  -0.18  NA         NA         NA                
    2       104        5.82    61.3    15.49    0.23  -0.38  -0.70  NA         NA         NA

这是我迄今为止尝试过的代码:

measure<-list("haz", "waz", "whz", "htcm", "wtkg", "bmi")

set_1.5_months <- function(x, y, z){
  maled_anthro[!is.na(z) & agedays > (x-45) & agedays <= (x-15), y:=z]
}

for(i in 1:length(measure)){
  z <- measure[i]
  y <- paste(measure[i], "1.5", sep="_")
  x <- 61
  maled_anthro_1<-set_1.5_months(x, y, z)
}

上面的代码没有成功。我只是在原始数据表中添加了一个新变量“y”,其中包含值“bmi”或“NA”。有人可以帮我找出这段代码哪里出错了吗?

我想保持函数类似于上面的格式(易于更改),因为我需要创建其他类似的函数,其中值“1.5”和 x==61 需要是换成其他数字,我喜欢这些在当前格式下相对容易更改。

【问题讨论】:

标签: r data.table


【解决方案1】:

我相信以下是通过将函数应用于许多现有列来创建新列的惯用方法。
请注意,我已将条件保持原样,全部否定以使代码尽可能接近问题。

library(data.table)

setDT(maled_anthro)

set_1.5_months <- function(y, agedays, x = 61){
  z <- y
  is.na(z) <- !(!is.na(y) & agedays > (x - 45) & agedays <= (x - 15))
  z
}

measure <- c("haz", "waz", "whz", "htcm", "wtkg", "bmi")
new_measure <- paste(measure, "1.5", sep = "_")

maled_anthro[, (new_measure) := lapply(.SD, function(y) set_1.5_months(y, agedays, x=61)), .SDcols = measure ]
#   pid agedays wtkg htcm   bmi   haz   waz   whz haz_1.5 waz_1.5 whz_1.5 htcm_1.5 wtkg_1.5 bmi_1.5
#1:   1       2 1.92 44.2  9.74 -2.72 -3.23    NA      NA      NA      NA       NA       NA      NA
#2:   1      29 2.68 49.2 11.07 -2.21 -3.03 -2.00   -2.21   -3.03   -2.00     49.2     2.68   11.07
#3:   1      61 3.63 52.0 13.42 -2.49 -2.62 -0.48      NA      NA      NA       NA       NA      NA
#4:   1      89 4.11 55.0 13.59 -2.20 -2.70 -1.14      NA      NA      NA       NA       NA      NA
#5:   2       1 2.40 48.1 10.37 -0.65 -1.88 -2.54      NA      NA      NA       NA       NA      NA
#6:   2      28 3.78 53.1 13.41 -0.14 -0.58 -0.79   -0.14   -0.58   -0.79     53.1     3.78   13.41
#7:   2      56 4.53 55.2 14.87 -0.68 -0.74 -0.18      NA      NA      NA       NA       NA      NA
#8:   2     104 5.82 61.3 15.49  0.23 -0.38 -0.70      NA      NA      NA       NA       NA      NA

数据

maled_anthro <- read.table(text = "
pid     agedays    wtkg    htcm    bmi     haz    waz    whz 
1       2          1.92    44.2    9.74    -2.72  -3.23  NA             
1       29         2.68    49.2    11.07   -2.21  -3.03  -2.00                
1       61         3.63    52.0    13.42   -2.49  -2.62  -0.48        
1       89         4.11    55.0    13.59   -2.20  -2.70  -1.14
2       1          2.40    48.1    10.37   -0.65  -1.88  -2.54          
2       28         3.78    53.1    13.41   -0.14  -0.58  -0.79
2       56         4.53    55.2    14.87   -0.68  -0.74  -0.18                 
2       104        5.82    61.3    15.49    0.23  -0.38  -0.70 
", header = TRUE)

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多