【问题标题】:How to calculate the t test for each groups in a data frame in R如何计算R中数据框中每个组的t检验
【发布时间】:2019-08-23 00:16:09
【问题描述】:

我有一个数据集如下:

library(dplyr)
salary_old<-c(100,200,300,400,10000,100,10,20,30)
salary_new<-c(200,300,400,500,230,240,30,40,50)
d<-as.Date(c('2019-01-01','2019-01-02','2019-01-03'))
country<-c('USA','UK','IR')
id<-c('A','B','A')
data<-data.frame(id,country,d,salary_new,salary_old)
data<-data %>% arrange(id,country,d)

然后我想使用循环或应用函数来计算每个组的新旧工资的 T.test,以检查每个组的 p 值是否小于 0.001。

我写的代码如下:

    datlist <- split(data ,list(data$id , data$country) )
 datlist<-datlist[sapply(datlist, nrow)>0]

 results<-  lapply(
  1:length(datlist) ,
  FUN = function(x) {
   t.test(datlist[[c(x,4)]] , datlist[[c(x,5)]])
  })

x<-matrix(nrow=3,ncol=1)
for (i in 1:length(results)){
   x[i]<-results[[i]]$p.value
  x[i]<-(sum(x[i]<0.001))

}

我得到了每个组的 p.value,但我想将其加入主数据框以了解与 id/country/combination 关联的 p_value 有多少:如下所示。

id   country  p-value         status
A     USA      0.5417366       0
A     IR       0.4321609       0
B     UK       0.7066187       0

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    如果我正确理解您的问题,您希望在操作结束时将所有结果合并到一个 data.frame 中。 首先,您为每个 t 检验构建 mini data.frames,然后 rbind他们。

    你可以用这个:

    results <- lapply(
        datlist,
        FUN = function(x) {
          tres <- t.test(x[["salary_new"]], x[["salary_old"]])
          lt05 <- sum(tres$p.value < 0.05)
          data.frame(x[1L, "id", drop = FALSE],
              x[1L, "country", drop = FALSE],
              pval = tres$p.value,
              status = lt05)
        }
    )
    
    do.call(rbind, unname(results))
    

    注意:问题中提出的显着性水平为 0.05。

    【讨论】:

    • 感谢您的回答,能否告诉我您创建的data.frame 中的1L 是什么?
    • 它只取分割 mini data.frame 的第一行,它表示第一个 ID 值或国家名称,因为它们对于每个 mini data.frame的所有行都是相同的
    猜你喜欢
    • 2023-03-11
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多