Прокручивать столбцы и сравнивать столбцы с похожим именем в R - PullRequest
0 голосов
/ 13 июня 2019

я снова спрашиваю про цикл через столбец в R. У меня есть данные с парами, как показано ниже:

a1.x a2.x a3.x a1.y a2.y a3.y 
2     1    2    2    3    2
1     1    3    2    2    3
4     2    2    1    2    4

На самом деле, у меня 45 таких пар, и я хотел бы вычислить t-критерий, вычислить другие вещи и сохранить значения для каждой пары в одной таблице. Поэтому мне интересно, могу ли я написать цикл для этого.

Я пытался сделать, как показано ниже:

name <-colnames(df[1:45])
name <-gsub(".x", "", name)

for (i in name){

value.x <- paste0(i,".x")
value.y <-paste0(i,".y")

t.dmean <- with(df,t.test(value.x, value.y, var.equal = FALSE))

m.case <-mean(value.x)
sd.case <-sd(value.x)
m.ctl <- mean(value.y)
sd.ctl <- sd(value.y)

d <-(m.case-m.ctl)/sqrt((sd.case^2+sd.ctl^2)/2)

out <-rbind(out, cbind(i,paste0(t.dmean$p.value), m.case, sd.case, m.ctl, sd.ctl, d))

}

Я ожидал, что таблица будет такой

scale p_value m.case sd.case m.ctl sd.ctl d
al     0.06    1.1    0.15    1.6   0.5   0.65
a2     0.07    2.1    0.20    2.2   0.10   0.33
a3     0.08    1.3    0.21    1.4   0.2    0.40

Но это не работает ... с ошибкой msg

Error in t.test.default(value.x, value.y, var.equal = FALSE) : 
  not enough 'x' observations
In addition: Warning messages:
1: In mean.default(x) : argument is not numeric or logical: returning NA
2: In var(x) : NAs introduced by coercion

Кто-нибудь знает, как это сделать?

Большое спасибо!

1 Ответ

1 голос
/ 13 июня 2019

Мы можем создать функцию и возвращать всю необходимую статистику из каждой группы столбцов.

get_statistics <- function(df) {
      p_val <- t.test(df)$p.value
      m.case <-mean(df[[1]])
      sd.case <-sd(df[[1]])
      m.ctl <- mean(df[[2]])
      sd.ctl <- sd(df[[2]])
      d <-(m.case-m.ctl)/sqrt((sd.case^2+sd.ctl^2)/2)
      c(p_val = p_val, m.case = m.case, sd.case = sd.case, m.ctl = m.ctl, 
        sd.ctl = sd.ctl, d = d)
}

, а затем используйте split.default, чтобы разделить столбцы по имени и применить функцию.

t(sapply(split.default(df, sub("\\..*", "", names(df))), get_statistics))

#      p_val m.case sd.case m.ctl sd.ctl      d
#a1 0.006566   2.33   1.528  1.67  0.577  0.577
#a2 0.001894   1.33   0.577  2.33  0.577 -1.732
#a3 0.000493   2.33   0.577  3.00  1.000 -0.816
...