Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a pvalue column to dataframe in R

I have a dataframe that looks like this:

A1 A2 A3 B1 B2 B3
0  1  0  2  3  3
5  6  4  4  6  6

I would like to add a column based on t-testing the significance of the difference between As and Bs:

A1 A2 A3 B1 B2 B3 PValue
0  1  0  3  3  4  <some small number>
5  6  4  4  6  6  <some large number>

I tried using dplyr like this:

data %>% 
    mutate(PValue = t.test(unlist(c(A1,A2,A3),unlist(c(B1,B2,B3)))$p.value)

However, the resulting PValue column is constant for some reason. I would appreciate any help.

like image 630
Novice Avatar asked Nov 25 '25 11:11

Novice


1 Answers

If we are doing this by row, then pmap is one way

library(tidyverse)
pmap_dbl(data, ~ c(...) %>% 
                   {t.test(.[1:3], .[4:6])$p.value}) %>% 
     bind_cols(data, PValue = .)
#   A1 A2 A3 B1 B2 B3      PValue
#1  0  1  0  2  3  3 0.007762603
#2  5  6  4  4  6  6 0.725030185

or another option is rowwise with do

data %>%
   rowwise() %>% 
   do(data.frame(., PValue = t.test(unlist(.[1:3]), unlist(.[4:6]))$p.value))
# A tibble: 2 x 7
#     A1    A2    A3    B1    B2    B3  PValue
#* <int> <int> <int> <int> <int> <int>   <dbl>
#1     0     1     0     2     3     3 0.00776
#2     5     6     4     4     6     6 0.725  

Or we can gather to 'long' format and then do the group by t.test

data %>%
  rownames_to_column('rn') %>%
  gather(key, val, -rn) %>% group_by(rn) %>% 
  summarise(PValue = t.test(val[str_detect(key, "A")],
                           val[str_detect(key, "B")])$p.value) %>% 
  pull(PValue) %>% 
  bind_cols(data, PValue = .)

data

data <- structure(list(A1 = c(0L, 5L), A2 = c(1L, 6L), A3 = c(0L, 4L), 
B1 = c(2L, 4L), B2 = c(3L, 6L), B3 = c(3L, 6L)), .Names = c("A1", 
"A2", "A3", "B1", "B2", "B3"), class = "data.frame", row.names = c(NA, 
-2L))
like image 154
akrun Avatar answered Nov 27 '25 03:11

akrun



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!