Как бы я создал функцию для разделения и усреднения строк этих данных - PullRequest
1 голос
/ 17 апреля 2019

Я новичок в R и имею большой фрейм данных, с помощью которого я хотел бы разделить данные одной буквой в имени столбца, а затем добавить в конце столбец, содержащий среднее значение строки. Данные выглядят следующим образом:

    V1          V2  V3             V4        V5       V6       V7       V8       V9      V10      
1          gene_id gene_symbol Chr        Biotype     L001P    L003P    L004P    L005P    L008P   
2  ENSG00000000003      TSPAN6   X protein_coding   31.8003  67.3098   63.033    63.83  38.6941  
3  ENSG00000000005        TNMD   X protein_coding 0.0372353  2.28841 0.032932        0 0.358512        
4  ENSG00000000419        DPM1  20 protein_coding   17.5575  43.7474  21.0119  22.9765  26.3166  
5  ENSG00000000457       SCYL3   1 protein_coding   2.68196   3.7079  3.14505  3.82323  3.32028  
6  ENSG00000000460    C1orf112   1 protein_coding  0.532179  2.46598  1.11985 0.584227  1.20095  

Существует около 70 столбцов и 13 строк, вы можете видеть только столбцы с окончанием «P» (V6: V10), однако в 39 столбцах ниже фрейма данных они заканчиваются буквой «t». Мне было интересно, как я разделил бы эти два "t" и "p", а затем имел в виду строки.

Я пробовал apply, lapply, grep и split, но все еще не могу их разделить. Всякий раз, когда я пытался применить среднее значение, оно возвращает значения NA по всем направлениям, а теперь определенно, куда идти.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

здесь data.table подход:

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

# load library

library(data.table)

# create data.table as the column binding of some letters and some numbers

dt <- cbind(data.table(x = LETTERS[1:5]), 
            as.data.table(matrix(sample(1:30, 30, FALSE), 
                                 nrow = 5)))

# the names aren't right, so we need to fix them according to your requirement:

names(dt) <- c("x", "1T", "2T", "3T", "1P", "2P", "3P")

Теперь рабочая часть: мы создадим столбец (для этого :=), к которому применено среднее значение (это функции apply и mean) для некоторых столбцов (это .SD), которые нам нужно определить (это часть .SDcols). Но это определение является двоичным, в зависимости от последней буквы имени столбца, поэтому мы используем grep:

dt[, averageTs := apply(.SD, 1, mean), .SDcols = grep("T$", names(dt))]

Здесь мы ищем T в конце строки, а вектор, который мы будем искать, - это вектор names самой data.table.

Выполнение этого для Ps - это та же команда, конечно, заменив Ts на Ps.

dt[, averagePs := apply(.SD, 1, mean), .SDcols = grep("P$", names(dt))]
1 голос
/ 17 апреля 2019

Прежде всего, вы неправильно прочитали данные (возможно, выбрали header = FALSE при импорте). Похоже, ваша первая строка должна быть вашим заголовком, а ваши фактические данные начинаются со строки 2 и далее.

names(df) <- df[1, ] #Give 1st row as column names
df  <- df[-1, ]      #Delete 1st row

Когда-то у нас получится найти столбец, который заканчивается на "t" или "P"

cols <- grep("P$|t$", names(df))

Поскольку ранее мы испортили 1-ю строку, тип столбцов изменился, и нам нужно преобразовать cols в числовое значение

df[cols] <- lapply(df[cols], as.numeric)

Теперь мы можем взять mean из этих строк, используя rowMeans

df$Mean <- rowMeans(df[cols], na.rm = TRUE)

Мне неясно, хотите ли вы рассчитать mean столбцов, заканчивающихся "P" и "t" вместе или по отдельности. Выше рассчитывается вместе. Если вы хотите рассчитать их отдельно, вы можете сделать

p_cols <- grep("P$", names(df))
t_cols <- grep("t$", names(df))
df[c(p_cols, t_cols)] <- lapply(df[c(p_cols, t_cols)], as.numeric)
df$P_Mean <- rowMeans(df[p_cols], na.rm = TRUE)
df$T_Mean <- rowMeans(df[t_cols], na.rm = TRUE)
...