使用R中的函数和条件函数参数进行分组和变异 请考虑以下事项:

使用R中的函数和条件函数参数进行分组和变异 请考虑以下事项:,r,dplyr,data.table,R,Dplyr,Data.table,自定义函数CustomFun接受多个数值参数。参数名称存储在resp中,并与函数参数名称相对应。参数值存储在columnval中 data.frame包含几个患者的信息(id),因此数据需要按id进行分组 问题: 如何将自定义函数应用于从同一数据结构中的列获取参数的数据分组data.frame或data.table 库(dplyr) #> #>正在附加包:“dplyr” #>以下对象已从“package:stats”屏蔽: #> #>滤波器,滞后 #>以下对象已从“package:base”

自定义函数
CustomFun
接受多个数值参数。参数名称存储在
resp
中,并与函数参数名称相对应。参数值存储在column
val

data.frame
包含几个患者的信息(
id
),因此数据需要按
id
进行分组

问题:

如何将自定义函数应用于从同一数据结构中的列获取参数的数据分组
data.frame
data.table

库(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
库(数据表)
#> 
#>正在附加包:“data.table”
#>以下对象已从“package:dplyr”屏蔽:
#> 
#>在…之间,在…之间
#数据
df.x id resp val
#>1瓦拉10
#>2.1 val.b 15
#>3.1 val.c NA
#>4.1瓦尔迪纳
#>5.1瓦莱纳
#>6.2 val.a 1
#>7.2 val.b 5
#>8.2 val.c NA
#>9.2瓦尔迪纳
#>10.2瓦莱纳
#一个简单的函数(最小可复制示例)
CustomFun%突变(res=c(25,25,NA,NA,NA,6,6,NA,NA,NA))
#>id resp val res
#>1 val.a 10 25
#>2 1 val.b 15 25
#>3.1 val.c NA NA
#>4.1 val.d NA NA
#>5.1 val.e NA
#>6.2 val.a 1 6
#>7 2 val.b 5 6
#>8.2 val.c NA
#>9.2 val.d NA
#>10.2 val.e NA
自己的方法:

当没有组(
id
)时,此方法有效。对于所有非
val.a
val.b
NA
val
中不存在问题,因为它们可以在第二步中过滤掉

#无需分组的方法:仅一个id,问题:在df.z[3:5,]
#dplyr
df.z%切片(1:5)
df.z
#>id resp val
#>1瓦拉10
#>2.1 val.b 15
#>3.1 val.c NA
#>4.1瓦尔迪纳
#>5.1瓦莱纳
df.z%>%变异(test=CustomFun(a=df.z%>%过滤器(resp==“val.a”)%%>%pull(val),
b=df.z%>%filter(resp==“val.b”)%>%pull(val))
)
#>id响应测试
#>1 val.a 10 25
#>2 1 val.b 15 25
#>3.1 val.c NA 25
#>4.1 val.d NA 25
#>5.1 val.e NA 25
#数据表
setDT(df.z)[,(test=CustomFun(a=setDT(df.z)[resp==“val.a”,val],
b=setDT(df.z)[resp==“val.b”,val]),
by=(id、val、resp)]
#>id-val-resp试验
#>1:110瓦拉25
#>2:115VAL.B25
#>3:1纳瓦尔c 25
#>4:1纳瓦尔d 25
#>5:1纳瓦尔25
#不为团体工作=====================================
#数据帧
df.x%>%
分组依据(id)%>%
变异(test=CustomFun(a=df.x%>%filter(resp==“val.a”)%%>%pull(val),
b=df.x%>%filter(resp==“val.b”)%>%pull(val))
)
#>mutate_impl(.data,dots)中出错:“test”列的长度必须为5(组大小)或1,而不是2
#数据表
setDT(df.x)[,(test=CustomFun(a=setDT(df.x)[resp==“val.a”,val],
b=setDT(df.x)[resp==“val.b”,val]),
by=(id、val、resp)]
#>id-val-resp试验
#>1:110瓦拉25
#>2:110瓦拉6
#>3:115VAL.B25
#>4:115VAL.B6
#>5:1纳瓦尔c 25
#>6:1 NA val.c 6
#>7:1纳瓦尔德25
#>8:1纳瓦尔德6
#>9:1纳瓦尔25
#>10:1纳瓦尔6
#>11:21瓦拉25
#>12:21瓦拉6
#>13:25 val.b 25
#>14:25 val.b 6
#>15:2纳瓦尔c 25
#>16:2 NA val.c 6
#>17:2纳瓦尔德25
#>18:2纳瓦尔德6
#>19:2纳瓦莱25
#>20:2纳瓦尔6
由(v0.2.1)于2018年11月13日创建


非常感谢

我们可以按组对值进行子集划分(假设每个“id”只有一个“val.a”、“val.b”,并添加

library(dplyr)
df.x %>%
    group_by(id) %>%
    mutate(res = (val[resp == 'val.a'] + val[resp == 'val.b']) * NA^(is.na(val)))
# A tibble: 10 x 4
# Groups:   id [2]
#      id resp    val   res
#   <int> <fct> <dbl> <dbl>
# 1     1 val.a    10    25
# 2     1 val.b    15    25
# 3     1 val.c    NA    NA
# 4     1 val.d    NA    NA
# 5     1 val.e    NA    NA
# 6     2 val.a     1     6
# 7     2 val.b     5     6
# 8     2 val.c    NA    NA
# 9     2 val.d    NA    NA
#10     2 val.e    NA    NA

有两个不同的问题:您在
data.table
中添加了不需要的分组变量,并且两个版本中的数据子集都不正确

数据调整。表:

setDT(df.x)[!is.na(val), test := CustomFun(a = val[resp == "val.a"],
                                           b = val[resp == "val.b"]), by = id]
无需按
resp
val
分组,只需按
id
分组

对于
dplyr
,您可以执行以下操作:

df.x %>%
  group_by(id) %>% 
  mutate(test = if_else(!is.na(val), CustomFun(a = val[resp == "val.a"],
                                               b = val[resp == "val.b"]), NA_real_)
  )
两种情况下的输出:

    id  resp val test
 1:  1 val.a  10   25
 2:  1 val.b  15   25
 3:  1 val.c  NA   NA
 4:  1 val.d  NA   NA
 5:  1 val.e  NA   NA
 6:  2 val.a   1    6
 7:  2 val.b   5    6
 8:  2 val.c  NA   NA
 9:  2 val.d  NA   NA
10:  2 val.e  NA   NA

谢谢你的回答。虽然它返回了正确的结果,但它没有考虑到自定义函数,这是我努力的一个重要部分。
    id  resp val test
 1:  1 val.a  10   25
 2:  1 val.b  15   25
 3:  1 val.c  NA   NA
 4:  1 val.d  NA   NA
 5:  1 val.e  NA   NA
 6:  2 val.a   1    6
 7:  2 val.b   5    6
 8:  2 val.c  NA   NA
 9:  2 val.d  NA   NA
10:  2 val.e  NA   NA