Есть ли способ получить доступ к данным из других групп при суммировании данных в R без использования цикла? - PullRequest
0 голосов
/ 13 октября 2019

Я только начинаю использовать data.table для анализа некоторых многомерных данных, где у меня есть несколько кластеров и несколько маркеров. Я хотел бы иметь возможность использовать функцию «by», но иметь возможность доступа к данным вне группы, то есть через =! Group. Я пытаюсь сравнить статистику группы и группы, не относящейся к группе.

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

library(data.table)
library(purrr)

data.table(iris) %>%
    melt %>%
    .[, .(mean = mean(value)), by = .(Species, variable)] %>%
    dcast(Species ~ variable)

Это позволяет мнеполучить сводную статистику для группы:


#       Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1:     setosa        5.006       3.428        1.462       0.246
# 2: versicolor        5.936       2.770        4.260       1.326
# 3:  virginica        6.588       2.974        5.552       2.026

Но, скажем, я хотел найти среднее (значение) по группе - среднее (значение) по! group

data.table(iris) %>%
    melt %>%
    .[variable == "Petal.Length"] %>%
    .[, group := Species == "setosa"] %>%
    .[, .(means = mean(value)), by = group] 

#    group means
# 1:  TRUE 1.462
# 2: FALSE 4.906

Это было быспособ найти его для одного кластера (setosa) и одного маркера (Petal.Length), но я не вижу, как его масштабировать.

1 Ответ

5 голосов
/ 13 октября 2019

Это то, что вы хотите?

library(data.table)

dt <- data.table(iris)
molten_dt <- melt(dt)

molten_dt[, .(means = mean(value),
              other_means = mean(molten_dt[Species != .BY[[1]] & variable == .BY[[2]], value])
            ),
          by = .(Species, variable)]

       Species     variable means other_means
 1:     setosa Sepal.Length 5.006       6.262
 2: versicolor Sepal.Length 5.936       5.797
 3:  virginica Sepal.Length 6.588       5.471
 4:     setosa  Sepal.Width 3.428       2.872
 5: versicolor  Sepal.Width 2.770       3.201
 6:  virginica  Sepal.Width 2.974       3.099
 7:     setosa Petal.Length 1.462       4.906
 8: versicolor Petal.Length 4.260       3.507
 9:  virginica Petal.Length 5.552       2.861
10:     setosa  Petal.Width 0.246       1.676
11: versicolor  Petal.Width 1.326       1.136
12:  virginica  Petal.Width 2.026       0.786

Чтобы понять, что происходит, полезно выполнить этот код:

molten_dt[, print(.BY), by = .(Species, variable)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...