2015-02-22 3 views
1

Я хотел бы сделать столбец ttest между двумя кадрами данных в R. То есть ttest(df1$col1,df2$col1), ttest(df1$col2,df2$col2) и т. Д .... Лучший вариант здесь - использовать mapply или Map функция. Что-то вроде:Удалите NA при использовании mapply для ttest в R

mapply(t.test,tnav_DJF_histo.csv[,-1],tnav_DJF.csv[,-1]) 

работает отлично, но если один из ваших ДФ столбцов имеет Nas, он терпит неудачу с этой ошибкой:

Error in t.test.default(dots[[1L]][[1L]], dots[[2L]][[1L]]) : 
    not enough 'y' observations 

Вопрос: как я могу использовать na.rm, чтобы получить работу? Например, если столбец в tnav_DJF.csv [, - 1] имеет Nas, но нет NA в tnav_DJF_histo.csv [, - 1], как я могу сообщить mapply, чтобы игнорировать или пропускать анализы для этих столбцов?

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

aez.

ответ

3

Вы можете сделать это с mapply и анонимную функцию следующим образом:

Пример данных:

df1 <- data.frame(a=runif(20), b=runif(20), c=rep(NA,20)) 
df2 <- data.frame(a=runif(20), b=runif(20), c=c(NA,1:18,NA)) 
#notice df1's third column is just NAs 

Решение:

Используйте mapply с анонимной функцией fo llows:

#anonumous function testing for NAs 
mapply(function(x, y) { 
    if(all(is.na(x)) || all(is.na(y))) NULL else t.test(x, y, na.action=na.omit) 
    }, df1, df2) 

Выход:

$a 

    Welch Two Sample t-test 

data: x and y 
t = 1.4757, df = 37.337, p-value = 0.1484 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.0543192 0.3458648 
sample estimates: 
mean of x mean of y 
0.5217619 0.3759890 


$b 

    Welch Two Sample t-test 

data: x and y 
t = 1.1689, df = 37.7, p-value = 0.2498 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.0815067 0.3041051 
sample estimates: 
mean of x mean of y 
0.5846343 0.4733351 


$c 
NULL 

P.S. В функции t.test нет аргумента na.rm. Существует только аргумент na.action, но даже если вы установите его на na.omit (который у меня есть), вы все равно получите ошибку, если все элементы столбца равны NA.

P.S.2 Если некоторые из элементов x или y являются NA, то функция t.test будет работать должным образом, опуская эти элементы. Если вы хотите игнорировать вычисление t.test, если какой-либо из столбцов содержит хотя бы один NA, вам необходимо изменить all в вышеуказанной функции на any.

+0

Отлично. Спасибо, @LyzandeR – code123

+0

Счастлив помочь :) – LyzandeR

0

Можете ли вы сделать что-то вроде

t.test2 <- function(col1, col2){ 
    df <- complete.cases(cbind(col1, col2)) 
    if(nrow(df) < 3){return(NA)} 
    t.test(df[, 1], df[, 2], na.rm = TRUE) 
    } 
mapply(t.test2, csv1[, -1], csv2[, -2]) 

 Смежные вопросы

  • Нет связанных вопросов^_^