2013-05-16 4 views
0

У меня есть кадр данных, похожий на встроенный InsectSprays (с числовыми и числовыми данными), но он содержит 10 + числовые и 20 + фактор-векторы с несколькими NA , Когда я boxplot (числовой коэффициент), я замечаю, что некоторые уровни выделяются, и я хочу иметь возможность сравнивать их с остальными.Как сравнить один уровень фактора со всеми остальными уровнями в R

В качестве примера: InsectSprays содержит числовой вектор, называемый count (0:26), и вектор факторов, называемый спреями с уровнями: A, B, C, D, E и F. В InsectSprays C является самым низким, поэтому Я хочу сравнить C со всеми остальными.

Я написал функцию для таких числовых векторов:

num_interlevel <- function(df, variable, category){ 
    #find the levels of the categorizing parameter 
    level.list <- levels(category) 
    #build enough columns in the plot area 
    par(mfrow=c(1,length(level.list))) 
    for(i in 1:length(level.list)){ 
    #subset the df containing only the level in question 
    variable.df <- na.omit(df[which(category == level.list[i]),]) 
    #subset the df containing all other levels 
    category.df <- na.omit(df[which(category != level.list[i]),]) 
    boxplot(variable.df[, variable], category.df[, variable]) 
    p <- t.test(variable.df[, variable], category.df[, variable])$p.value 
    title(paste(level.list[i], "=", p)) 
    } 
} 

и num_interlevel(InsectSprays, "count", InsectSprays$spray) дает мне результат я хочу.

Но когда дело доходит до сравнения векторов факторов друг с другом (и я использовал таблицы для этого), это не сработает, просто потому, что dataframes имеют разный размер и, что более важно, потому что это неправильный путь.

Тогда я думал, что для этого может существовать существующая функция, но не удалось найти. Может ли кто-нибудь предложить способ/функцию для создания одного подмножества, содержащего ровно один уровень и другое подмножество, содержащее все остальные уровни?

#dput: 
structure(list(Yas = c(27, 18, 17, 18, 18), Cinsiyet = structure(c(2L, 
2L, 2L, 1L, 1L), .Label = c("Erkek", "Kadın"), class = "factor"), 
Ikamet = structure(c(5L, 4L, 3L, 3L, 5L), .Label = c("Aileyle", 
"Akrabayla", "Arkadaşla", "Devlet yurdu", "Diğer", "Özel yurt", 
"Tek başına"), class = "factor"), Aile_birey = c(13, 9, 6, 
10, 6), Aile_gelir = c(700, 1000, 1500, 600, 800)), .Names = c("Yas", 
"Cinsiyet", "Ikamet", "Aile_birey", "Aile_gelir"), row.names = c(NA, 
5L), class = "data.frame") 

Редактировать

Я реформирована мои функции после ответа Джеймса. Это, конечно, не элегантное решение, но я положил его здесь на будущее:

n.compare <- function(df, variable, category){ 
    level.list <- levels(df[,category]) 
    par(mfrow=c(1,length(level.list))) 
    for(i in 1:length(level.list)){ 
    boxplot(df[,variable] ~ (df[,category] == level.list[i])) 
    p <- t.test(df[,variable] ~ (df[,category] == level.list[i]))$p.value 
    title(paste(level.list[i], "=", p)) 
    } 
} 

f.compare <- function(df, variable, category){ 
    level.list <- levels(df[,category]) 
    par(mfrow=c(1,length(level.list))) 
    for(i in 1:length(level.list)){ 
    print(paste(level.list[i])) 
    print(table((df[,category] == level.list[i]), df[,variable])) 
    writeLines("\n") 
    } 
} 
+0

Пожалуйста, используйте функцию 'dput', чтобы включить небольшой пример ваших данных в вопрос. –

+0

Не могли бы вы рассказать о том, что вы подразумеваете под «сопоставлением векторов факторов друг с другом»? Например. учитывая приведенные выше данные, что бы вы хотели, чтобы результат был? –

+0

@ Victor K. Прошу прощения за последний комментарий ниже. Я понял, что функция таблицы уже обеспечивает все, что мне нужно, в одном месте с помощью пропорций. – barerd

ответ

2

Для дробить data.frame используйте split:

lapply(split(InsectSprays,InsectSprays$spray=="A"),summary) 
$`FALSE` 
    count  spray 
Min. : 0.00 A: 0 
1st Qu.: 3.00 B:12 
Median : 5.00 C:12 
Mean : 8.50 D:12 
3rd Qu.:13.25 E:12 
Max. :26.00 F:12 

$`TRUE` 
    count  spray 
Min. : 7.00 A:12 
1st Qu.:11.50 B: 0 
Median :14.00 C: 0 
Mean :14.50 D: 0 
3rd Qu.:17.75 E: 0 
Max. :23.00 F: 0 

Также рассмотреть следующие:

boxplot(count~(spray=="A"),InsectSprays) 
+0

Если честно, ваше решение boxplot по крайней мере супер элегантно по сравнению с моим. Однако, несмотря на это понимание, я все еще борется с сопоставлением векторов факторов друг с другом. Проблема, вероятно, связана с тем, что я еще не знаком с R еще (даже не знал раскола). Так есть ли какой-нибудь другой намек на стол? – barerd

+0

@barerd Чтобы сравнить средства, например: 'sapply (levels (insectSprays $ spray), function (x) lapply (split (InsectSprays, InsectSprays $ spray == x), функция (y) mean (y $ count)))' – James