Вычитание среднего из каждых двух столбцов из двух кадров данных R - PullRequest
0 голосов
/ 29 ноября 2018

Предположим, у меня есть два фрейма данных следующим образом:

df1 <- data.frame(ceiling(runif(10,1,10)), ceiling(runif(10,1,10)), ceiling(runif(10,1,10)))
colnames(df1) <- c("V1","V2","V3")
df2 <- data.frame(ceiling(runif(10,1,10)), ceiling(runif(10,1,10)), ceiling(runif(10,1,10)))
colnames(df2) <- c("V1","V2","V3")

Используя эти фиктивные данные, я хочу создать новый фрейм данных с 1 столбцом и 3 строками:

         V1    

1  mean(df1$V1) - mean(df2$V1)
2  mean(df1$V2) - mean(df2$V2)
3  mean(df1$V3) - mean(df2$V3)

IТакже хочу создать другой фрейм данных следующим образом:

         V1    

1  wilcox.test(df1$V1,df2$V1)$p.value
2  wilcox.test(df1$V2,df2$V2)$p.value
3  wilcox.test(df1$V3,df2$V3)$p.value

Мои реальные данные имеют 54 столбца, поэтому для моих данных каждый фрейм данных будет иметь 54 строки.

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Значения:

data.frame(mean = colMeans(df1) - colMeans(df2))
#    mean
# V1  1.4
# V2  2.0
# V3  1.4

P-значения:

data.frame(
    p.value = mapply(function(x, y) wilcox.test(x, y)$p.value, df1, df2)
)
#       p.value
# V1 0.32060365
# V2 0.07784363
# V3 0.21779915
0 голосов
/ 29 ноября 2018

Вы можете сделать это, используя вектор из них:

 m1 =  (t(df1) %*% rep(1, nrow(df1))) / nrow(df1) # Equivalent to a mean
 m2 =  (t(df2) %*% rep(1, nrow(df2))) / nrow(df2) 

m1-m2
0 голосов
/ 29 ноября 2018

Вот подход tidyverse для создания таблицы с информацией о выполненных вами тестах:

# for reproducibility
set.seed(215)

# example datasets
df1 <- data.frame(ceiling(runif(10,1,10)), ceiling(runif(10,1,10)), ceiling(runif(10,1,10)))
colnames(df1) <- c("V1","V2","V3")
df2 <- data.frame(ceiling(runif(10,1,10)), ceiling(runif(10,1,10)), ceiling(runif(10,1,10)))
colnames(df2) <- c("V1","V2","V3")

library(tidyverse)

list(df1, df2) %>%                     # put your dataframes in a list
  map_df(data.frame, .id = "df") %>%   # create a dataframe with an id value for each dataset
  tbl_df() %>%                         # for visualisation purposes only
  gather(v, x, -df) %>%                # reshape data
  nest(-v) %>%                         # nest data
  mutate(w.t = map(data, ~wilcox.test(.x$x ~ .x$df)),    # perfom wilcoxon test
         pval = map_dbl(w.t, "p.value"),                 # extract p value
         mean_diff = map_dbl(data, ~mean(.x$x[.x$df==1])-mean(.x$x[.x$df==2]))) # calculate mean difference

# # A tibble: 3 x 5
#   v     data              w.t           pval mean_diff
#   <chr> <list>            <list>       <dbl>     <dbl>
# 1 V1    <tibble [20 x 2]> <S3: htest> 0.730      0.600
# 2 V2    <tibble [20 x 2]> <S3: htest> 0.145     -1.8  
# 3 V3    <tibble [20 x 2]> <S3: htest> 0.0295     2.8 

Столбец v представляет ваши переменные (начальные столбцы).

Столбец data содержит переменные, используемые для соответствующего теста.

Столбец w.t включает выходные данные теста.

Столбец pval - это извлеченное значение p из каждого теста.

Столбец mean_diff - это средняя разница.

Если вы сохраните описанный выше процесс как results, вы сможете использовать results$w.t и увидеть результаты теста

0 голосов
/ 29 ноября 2018

Q1

data.frame(mean=sapply(df1, mean)-sapply(df2,mean))

Q2

out <- NULL
for(i in 1:ncol(df1)) out[[i]] <- wilcox.test(df1[,i], df2[,i])$p.value
data.frame(p=unlist(out))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...