У меня есть кадр данных, похожий на встроенный 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")
}
}
Пожалуйста, используйте функцию 'dput', чтобы включить небольшой пример ваших данных в вопрос. –
Не могли бы вы рассказать о том, что вы подразумеваете под «сопоставлением векторов факторов друг с другом»? Например. учитывая приведенные выше данные, что бы вы хотели, чтобы результат был? –
@ Victor K. Прошу прощения за последний комментарий ниже. Я понял, что функция таблицы уже обеспечивает все, что мне нужно, в одном месте с помощью пропорций. – barerd