问题描述
我想要做的是为某个比例的上下置信区间设置列。
这是我所做的:
> #Create some sample data
> Frustration <- data.table(group = c('A','B','C'),trials = c(363,1398,139),surg = c(57,276,18))
> Frustration
group trials surg
1: A 363 57
2: B 1398 276
3: C 139 18
>
> #try to get confidence levels. what I am expecting is CI to be a list of 2 elements,for each value of group,but I don't think that is working
> F2 <- Frustration[,.(CI = prop.test(surg,trials,conf.level = .75)['conf.int']),by = .(group)]
> F2
group CI
1: A 0.1350140,0.1816828
2: B 0.1851178,0.2103210
3: C 0.09701967,0.16972056
>
> #lower is still a list here - I am stumped
> F3 <- F2[,.(lower = CI[[1]]),by = .(group)]
> F3
group lower
1: A 0.1350140,0.16972056
我认为混乱与列表以及数据表如何处理返回值有关。
感谢您的帮助,
大卫
解决方法
CI
是一个list
列。我们可以使用transpose
并分配(:=
)
library(data.table)
F2[,c('lower','upper') := data.table::transpose(CI)][,CI := NULL][]
#Key: <group>
# group lower upper
# <char> <num> <num>
#1: A 0.13501400 0.1816828
#2: B 0.18511780 0.2103210
#3: C 0.09701967 0.1697206
,
另一种解决方案可行,但这是一个简单的单行代码:
library(data.table)
Frustration <- data.table(group = c('A','B','C'),trials = c(363,1398,139),surg = c(57,276,18))
Frustration[,c("lower","upper") :=
as.list(prop.test(surg,trials,conf.level = .75)$conf.int),by=group][]
#> group trials surg lower upper
#> 1: A 363 57 0.13501400 0.1816828
#> 2: B 1398 276 0.18511780 0.2103210
#> 3: C 139 18 0.09701967 0.1697206
甚至更简单,但是您必须进行一些重命名:
Frustration[,as.list(prop.test(surg,by=group]
#> group V1 V2
#> 1: A 0.13501400 0.1816828
#> 2: B 0.18511780 0.2103210
#> 3: C 0.09701967 0.1697206