Как применить функцию в каждом столбце фрейма данных?

#r

#r

Вопрос:

У меня есть следующий фрейм данных с 345 строками и 237 столбцами в R:

 snp1 snp2 snp3 ... snp237 
0 1 2 ... 0
0 1 1 ... 1
1 1 2 ... 2
1 0 0 ... 0
... ... ... ...
2 2 1 ... 0
  

Я хочу применить следующую функцию в каждом столбце:

 D=(number of 0)/(number of rows)
H=(number of 1)/(number of rows)
R=(number of 2)/(number of rows)
p=D (0.5*H)
q=R (0.5*H)
  

Наконец, я хочу сохранить «p» и «q» для каждого snp в векторе. Эта функция вычисляет «p» и «q» для каждого snp в одной команде R. Это возможно?

Результат таков:

 snp1 snp2 snp3 ... snp237
p1 p2 p3 ... ... p237
q1 q2 q3 ... ... q237
  

Заранее спасибо.

Комментарии:

1. Как выглядит ваш ожидаемый результат?

2. Я ожидаю вектор с p и q для каждого snp (столбца).

3. Попробуйте f1 <- function(x) {H <- mean(x == 1);list(p = mean(x == 0) (0.5 * H), q = mean(x == 2) (0.5 * H))}; library(dplyr); df1 %>% summarise_all(f1) %>% unnest

Ответ №1:

 #DATA
set.seed(42)
d = data.frame(snp1 = sample(0:2, 10, TRUE),
               snp2 = sample(0:2, 10, TRUE),
               snp3 = sample(0:2, 10, TRUE))

#Function    
foo = function(x){
    len = length(x)
    D = sum(x == 0)/len
    H = sum(x == 1)/len
    R = sum(x == 2)/len
    p = D   0.5 * H
    q = R   0.5 * H
    return(c(p = p, q = q))
}

#Run foo for each column   
sapply(d, foo)
#  snp1 snp2 snp3
#p 0.35 0.4  0.35
#q 0.65 0.6  0.65
  

Ответ №2:

Вот вариант с tidyverse . Создайте функцию ( f1 ) на основе логики в коде OP, чтобы возвращать значение list длиной 2, затем используйте это в summarise_all , чтобы применить функцию к каждому из столбцов dataset

 library(dplyr)
library(tidyr)
f1 <- function(x) {
              H <- 0.5 * mean(x == 1)
              list(list(p = mean(x == 0)   H,
                  q = mean(x == 2)   H))
                  }
df1 %>%
   summarise_all(f1) %>% 
   unnest
#  snp1  snp2  snp3
#1 0.75 0.625 0.375
#2 0.25 0.375 0.625
  

данные

 df1 <- structure(list(snp1 = c(0L, 0L, 1L, 1L), snp2 = c(1L, 1L, 1L, 
 0L), snp3 = c(2L, 1L, 2L, 0L)), class = "data.frame", row.names = c(NA, 
  -4L))