Примените один и тот же набор функций к нескольким фреймам данных с одинаковыми заголовками столбцов. - PullRequest
1 голос
/ 22 марта 2019

У меня есть большой DF для фрейма данных, который я разделил на 6 квантилей и назначил один DF для каждого квантиля, причем каждый DF имеет одинаковые имена заголовков.

Я хочу применить одинаковые функции ко всем6 кадров данных и создать результирующий DF, который содержит результаты, проиндексированные каждым DF.

Например, сгенерировать среднее значение, подсчитать для каждого столбца, получить процент от каждой переменной (процент от значений в каждом столбце) и так далее.

Эти действия будут общими для всех DF.

На данный момент я делаю это вручную, как показано ниже

res_df = data.frame ("col_headers" = c("names"), 
                     "df1_out" =  c(sum(df1$C1)/nrow(df1),
                                    sum(df1$C1)/nrow(df1),...
                                    mean(df1$C1))
                      "df2_out" = c(sum(df2$C1)/nrow(df2),
                                    sum(df2$C2)/nrow(df2),...
                                    mean(df2$C1))
                        .
                        .
                        .
                       "df6_out" = c(sum(df6$C1)/nrow(df6),
                                    sum(df6$C2)/nrow(df6),...
                                    mean(df6$C1))

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

Мне было интересно, есть ли способ автоматизировать весь этот процесс DF-> Quantile split-> Список DF квантилей-> среднее, процентное соотношение (вклад каждой строки) и т. д. -> результаты в новых DF-> сравнительные графики

1 Ответ

1 голос
/ 22 марта 2019

Вы можете создать факторную переменную с квантилями, а затем использовать ее для разделения () фрейма данных, например так (пример с радужной оболочкой):

> data("iris")
> 
> iris$quantiles <- cut(iris$Sepal.Width, quantile(iris$Sepal.Width, probs = seq(0, 1, 1/6)),
+                       include.lowest = TRUE)
> lista <- split(iris, iris$quantile)

Это даст вам список с вашим фреймом данных, разбитым на части. Затем используйте lapply / sapply для выполнения операций над всеми фреймами данных, например:

> mediaCol <- sapply(lista, function(x) {
+   colMeans(x[colnames(x) != c("Species", "quantiles")])
+   })
> 
> mediaCol
              [2,2.7] (2.7,2.9]  (2.9,3]  (3,3.2] (3.2,3.42] (3.42,4.4]
Sepal.Length 5.757576  6.220833 6.015385 5.954167   5.550000      5.520
Sepal.Width  2.493939  2.841667 3.000000 3.154167   3.366667      3.752
Petal.Length 4.330303  4.754167 4.234615 3.770833   3.044444      2.052
Petal.Width  1.378788  1.545833 1.403846 1.254167   1.000000      0.508

Вклад в процентах от столбца может быть:

> percCont <- lapply(lista, function(x) {
+   x[colnames(x) != c("Species", "quantiles")] <-
+     apply(x[colnames(x) != c("Species", "quantiles")], 2, function(y) {y / sum(y)})
+   return(x)
+ })
> 
> percCont[1]
$`[2,2.7]`
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species quantiles
42    0.02368421  0.02794654  0.009097271 0.006593407     setosa   [2,2.7]
54    0.02894737  0.02794654  0.027991603 0.028571429 versicolor   [2,2.7]
58    0.02578947  0.02916160  0.023093072 0.021978022 versicolor   [2,2.7]
60    0.02736842  0.03280680  0.027291812 0.030769231 versicolor   [2,2.7]
61    0.02631579  0.02430134  0.024492652 0.021978022 versicolor   [2,2.7]
63    0.03157895  0.02673147  0.027991603 0.021978022 versicolor   [2,2.7]
68    0.03052632  0.03280680  0.028691393 0.021978022 versicolor   [2,2.7]
69    0.03263158  0.02673147  0.031490553 0.032967033 versicolor   [2,2.7]
70    0.02947368  0.03037667  0.027291812 0.024175824 versicolor   [2,2.7]
73    0.03315789  0.03037667  0.034289713 0.032967033 versicolor   [2,2.7]
80    0.03000000  0.03159174  0.024492652 0.021978022 versicolor   [2,2.7]
81    0.02894737  0.02916160  0.026592022 0.024175824 versicolor   [2,2.7]
82    0.02894737  0.02916160  0.025892232 0.021978022 versicolor   [2,2.7]
83    0.03052632  0.03280680  0.027291812 0.026373626 versicolor   [2,2.7]
84    0.03157895  0.03280680  0.035689293 0.035164835 versicolor   [2,2.7]
88    0.03315789  0.02794654  0.030790763 0.028571429 versicolor   [2,2.7]
90    0.02894737  0.03037667  0.027991603 0.028571429 versicolor   [2,2.7]
91    0.02894737  0.03159174  0.030790763 0.026373626 versicolor   [2,2.7]
93    0.03052632  0.03159174  0.027991603 0.026373626 versicolor   [2,2.7]
94    0.02631579  0.02794654  0.023093072 0.021978022 versicolor   [2,2.7]
95    0.02947368  0.03280680  0.029391183 0.028571429 versicolor   [2,2.7]
99    0.02684211  0.03037667  0.020993702 0.024175824 versicolor   [2,2.7]
102   0.03052632  0.03280680  0.035689293 0.041758242  virginica   [2,2.7]
107   0.02578947  0.03037667  0.031490553 0.037362637  virginica   [2,2.7]
109   0.03526316  0.03037667  0.040587824 0.039560440  virginica   [2,2.7]
112   0.03368421  0.03280680  0.037088873 0.041758242  virginica   [2,2.7]
114   0.03000000  0.03037667  0.034989503 0.043956044  virginica   [2,2.7]
119   0.04052632  0.03159174  0.048285514 0.050549451  virginica   [2,2.7]
120   0.03157895  0.02673147  0.034989503 0.032967033  virginica   [2,2.7]
124   0.03315789  0.03280680  0.034289713 0.039560440  virginica   [2,2.7]
135   0.03210526  0.03159174  0.039188244 0.030769231  virginica   [2,2.7]
143   0.03052632  0.03280680  0.035689293 0.041758242  virginica   [2,2.7]
147   0.03315789  0.03037667  0.034989503 0.041758242  virginica   [2,2.7]

Вы можете воссоединить кадры данных с помощью unsplit ():

> iris_percCont <- unsplit(percCont, iris$quantiles)
> 
> head(iris_percCont)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species  quantiles
1   0.03695652  0.03731343   0.02729045 0.015748031  setosa (3.42,4.4]
2   0.03132992  0.03846154   0.01271571 0.005479452  setosa    (2.9,3]
3   0.03289013  0.04227213   0.01436464 0.006644518  setosa    (3,3.2]
4   0.03219034  0.04095112   0.01657459 0.006644518  setosa    (3,3.2]
5   0.03623188  0.03837953   0.02729045 0.015748031  setosa (3.42,4.4]
6   0.03913043  0.04157783   0.03313840 0.031496063  setosa (3.42,4.4]

Кроме того, есть много способов составить план. Функция lapply может помочь вам и в этом.

Надеюсь, это поможет.

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