Как перебрать столбцы датафрейма в R и вывести квантили () для каждого столбца в виде строки в новом фрейме данных - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь вычислить процентили каждого столбца кадра данных, чтобы сохранить их в виде строк в новом кадре данных. Затем я продолжу чертить этот новый df как линейный график, обернутый разными, основанными на разных подгруппах в моих данных.

Но мои текущие попытки приводят к пустому, не обновленному df.

Я могу сделать следующее для одного указанного столбца:

dataframe:
    col1
1    15
2    24
3    23
4    25
5    25
sequence <- seq(from=0, to=1, by=0.01)
quantiles_df <- as.data.frame(quantile(df$col1, sequence))

и я могу сделать следующее, чтобы нарисовать несколько гистограмм, по 1 для каждого столбца моего кадра данных, используя этот код

for (i in 1:length(df)){
print (i)
hist(df[[i]], main="histogram", breaks=20)
}

однако объединение этого цикла for с моей функцией quantile возвращает либо ошибки, либо только один столбец данных.

Возвращает файл quantile.df с 1 столбцом

for (i in 1:length(df)){
print(i)
quantile.df <- as.data.frame(quantile(df[[i]], sequence, na.rm=TRUE))
}

Возвращает ошибку при попытке использовать имена столбцов, а не номера столбцов

for (i in colnames(df)){
print(i)
quantile.df <- as.data.frame(quantile(genes2$[i], sequence, na.rm=TRUE))
}

Ожидаемые результаты:

кадр данных из 120 столбцов на 101 строку, содержащий каждый результат для каждого процентиля от 0 до 100

Фактические результаты:

при использовании length () -> 1 столбец x 101 строка данных

при использовании colnames () ->

Error: unexpected '[' in:
"print(i)
quantile.df <- as.data.frame(quantile(df$['



Ответы [ 2 ]

0 голосов
/ 18 января 2019

Воспроизводимые данные

df <- as.data.frame(matrix(rnorm(400), 100, 4))

Гистограмма и квантиль

Вы получите гистограмму и квантиль одновременно по коду ниже. Я использую mapply() вместо sapply(), потому что я хочу, чтобы заголовки гистограмм соответствовали названию каждого столбца. Если у вас нет запроса, вы можете изменить его.

par(mfrow = c(1, 4))
quant <- mapply(function(value, name){
  hist(value, main = paste0("Histogram of ", name), breaks = 20)
  quantile(value, seq(0, 1, by = 0.1))
}, df, names(df), SIMPLIFY = T)

quant

#               V1          V2          V3         V4
# 0%   -2.44712416 -2.63463290 -3.08872658 -2.8410463
# 10%  -0.88944226 -1.16264448 -1.24097984 -1.1701429
# 20%  -0.71782990 -0.91843217 -0.75868358 -0.8962623
# 30%  -0.51587838 -0.66932521 -0.52816811 -0.8046574
# ...

enter image description here

Обратите внимание, что вывод mapply() является матрицей. Если вы хотите, чтобы это был фрейм данных, попробуйте:

as.data.frame(quant)

Если вам нужен квантиль в ряду, попробуйте:

as.data.frame(t(quant))
0 голосов
/ 18 января 2019

Ваша основная проблема в том, что вы не меняете то, что назначаете, каждый раз, когда через цикл вы пытаетесь перезаписать quantile.df, не говоря R, чтобы поместить вещи в новый ряд.

Однако, есть более хороший способ с sapply. sapply будет циклом по умолчанию над столбцами фрейма данных, применяет функцию и упрощает результат.

Вот простой пример с несколькими квантилями во встроенных mtcars данных:

quants = c(0.25, 0.5, 0.75)
sapply(mtcars, quantile, probs = quants)
#        mpg cyl    disp    hp  drat      wt    qsec vs am gear carb
# 25% 15.425   4 120.825  96.5 3.080 2.58125 16.8925  0  0    3    2
# 50% 19.200   6 196.300 123.0 3.695 3.32500 17.7100  0  0    4    2
# 75% 22.800   8 326.000 180.0 3.920 3.61000 18.9000  1  1    4    4

(Обратите внимание, что это matrix, вы можете использовать as.data.frame() на нем.)

Аналогично, вы можете получить гистограммы для каждого столбца с помощью sapply(mtcars, hist).

Чтобы сделать это хорошо с циклом, вы должны предварительно выделить фрейм данных результата (чтобы он соответствовал размеру), а затем заполнить его столбец за столбцом. Я могу добавить пример, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...