Basic - T-Test - Grouping Factor Must have Exactly 2 Levels
are you doing this:
t.test(y~x)
when you mean to do this
t.test(y,x)
In general use the ~
then you have data like
y <- 1:10
x <- rep(letters[1:2], each = 5)
and the ,
when you have data like
y <- 1:5
x <- 6:10
I assume you're doing something like:
y <- 1:10
x <- rep(1,10)
t.test(y~x) #instead of t.test(y,x)
because the error suggests you have no variation in the grouping factor x
R t-test Grouping factor must have exactly 2 levels error
The problem is that your grouping variable has more than two levels, when the t.test requires that you cannot have more than two levels.
Here is a reproduction of your error:
library(tidyverse)
##This will reproduce your error
##Create some fake data
data_test <- tibble(measure = c(rnorm(100,30,5),rnorm(100,15,5)),
group = factor(rep(c("A","B","C"),c(95,95,10))))
table(data_test$group) ##Notice that you have three levels
#Try to run the test
t.test(measure~group, data = data_test, paired = TRUE)
Here is an example that will run
##This will not result in a error, because you only have two groups
data_test2 <- tibble(measure = c(rnorm(100,30,5),rnorm(100,15,5)),
group = factor(rep(c("A","B"),c(100,100))))
table(data_test$group) ##Notice that you have the required two levels
t.test(measure~group, data = data_test2,paired = TRUE) ##Test will now run
Takeaway: Check the number of levels in your data. If there are more than two, recode or delete them.
R: wilcoxon test Error: Grouping Factor must have exactly 2 levels
I just figured out ,
instead of ~
works for my problem.
R ttest inside ddply gives error grouping factor must have exactly 2 levels
You get an error because , you get a for at least one sub-group , unique status value for all score's.
This reproduce the error, the status is unique (equal to 1) for all scores.
dx = read.table(text=' score status
1 1 1
2 2 1
3 3 1 ')
t.test(score ~ status, data = dx)
Error in t.test.formula(score ~ status, data = dx) :
grouping factor must have exactly 2 levels
this correct the problem but create another known problem with t.test
, you should have enough observations( I think >= 2):
dx = read.table(text=' score status
1 1 1
2 2 1
3 3 2 ')
t.test(score ~ status, data = dx)
Error in t.test.default(x = 1:2, y = 3L) : not enough 'y' observations
Finally this correct all the problems:
dx = read.table(text=' score status
1 1 1
2 2 1
3 3 2
4 4 2')
t.test(score ~ status, data = dx)
Welch Two Sample t-test
data: score by status
t = -2.8284, df = 2, p-value = 0.1056
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-5.042435 1.042435
sample estimates:
mean in group 1 mean in group 2
1.5 3.5
EDIT I explain the problem without giving a solution, because you don't give a reproducible example.
one solution is do computation only for good groups:
ddply(df, c("freq","snpsincluded"), function(x)
{
if(length(unique(x$status)==2)
pval=t.test(score~status,data=x)$p.value
})
Related Topics
How to Generate a Frequency Table in R with With Cumulative Frequency and Relative Frequency
Ctree() - How to Get the List of Splitting Conditions for Each Terminal Node
How to Subset Data.Frames Stored in a List
R View() Does Not Display All Columns of Data Frame
Subscripts and Superscripts "-" or "+" with Ggplot2 Axis Labels? (Ionic Chemical Notation)
How to Create an Edge List from a Matrix in R
Assign New Data Point to Cluster in Kernel K-Means (Kernlab Package in R)
Extracting Off-Diagonal Slice of Large Matrix
How to Show the Progress of Code in Parallel Computation in R
Multiple Graphs Over Multiple Pages Using Ggplot
Correlation Corrplot Configuration
Change the Color and Font of Text in Shiny App
Filter One Selectinput Based on Selection from Another Selectinput