Сводная статистика с использованием ddply - PullRequest
5 голосов
/ 19 апреля 2011

Мне нравится писать функцию, используя ddply, которая выводит сводную статистику на основе имени двух столбцов data.frame mat.

  • mat - это большое data.frame с названием столбцов "metric", "length", "species", "tree", ...,"index"

  • index является множителем с 2 уровнями "Short", "Long"

  • "metric", "length", "species", "tree" и другие являются непрерывными переменными

Функция:

summary1 <- function(arg1,arg2) {
    ...

    ss <- ddply(mat, .(index), function(X) data.frame(
        arg1 = as.list(summary(X$arg1)),
        arg2 = as.list(summary(X$arg2)),
        .parallel = FALSE)

    ss
}

Я ожидаю, что результат будет выглядеть после вызова summary1("metric","length")

Short metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length
.Median length.Mean length.3rd.Qu. length.Max. 

....

Long metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length
.Median length.Mean length.3rd.Qu. length.Max.

....

В данный момент функция не выдает желаемый результат? Какую модификацию следует сделать здесь?

Спасибо за вашу помощь.


Вот игрушечный пример

mat <- data.frame(
    metric = rpois(10,10), length = rpois(10,10), species = rpois(10,10),
    tree = rpois(10,10), index = c(rep("Short",5),rep("Long",5))
)

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

Как Ник написал в своем ответе , вы не можете использовать $ для ссылки на переменную, переданную как имя персонажа.Когда вы пишете X$arg1, тогда R ищите столбец с именем "arg1" в data.frame X.Вы можете сослаться на него либо по X[,arg1], либо по X[[arg1]].

. И если вы хотите получить вывод с красивым именем, я предлагаю следующее решение:

summary1 <- function(arg1, arg2) {

    ss <- ddply(mat, .(index), function(X) data.frame(
        setNames(
            list(as.list(summary(X[[arg1]])), as.list(summary(X[[arg2]]))),
            c(arg1,arg2)
            )), .parallel = FALSE)

    ss
}
summary1("metric","length")

Вывод для игрушечных данных:

  index metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu.
1  Long           5              7            10         8.6             10
2 Short           7              7             9         8.8             10
  metric.Max. length.Min. length.1st.Qu. length.Median length.Mean length.3rd.Qu.
1          11           9             10            11        10.8             12
2          11           4              9             9         9.0             11
  length.Max.
1          12
2          12
1 голос
/ 19 апреля 2011

Это больше похоже на то, что вы хотите?

summary1 <- function(arg1,arg2) {
ss <- ddply(mat, .(index), function(X){ data.frame(
    arg1 = as.list(summary(X[,arg1])),
    arg2 = as.list(summary(X[,arg2])),
    .parallel = FALSE)})
ss
}
...