Как рассчитать t-тест для каждой группы в кадре данных в R - PullRequest
1 голос
/ 01 апреля 2019

У меня есть набор данных следующим образом:

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 для каждой группы, но я хочу присоединить его к основному фрейму данных, чтобы узнать, сколько p_value связано с идентификатором / страной / комбинацией: как показано ниже.

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

1 Ответ

1 голос
/ 01 апреля 2019

Если я правильно понимаю ваш вопрос, вы хотите объединить все результаты в один data.frame в конце своей работы. Сначала вы строите мини data.frame s для каждого t-теста, а затем 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, как указано в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...