在不使用循环的情况下汇总R中的数据时,是否可以从其他组访问数据?

Dun*_*ray 0 r dplyr data.table purrr

我刚刚开始使用data.table来分析一些高维数据,其中有几个簇和几个标记。我希望能够使用“ by”功能,但能够访问组外的数据,即by =!group。我正在尝试比较该组与非该组的统计信息。

我浏览了文档,.SD看起来很吸引人,但似乎并不能完全解决我的问题,因为它只允许访问分组的data.table。我确定我可以使用循环或应用来完成此操作,但是我认为这不会像使用data.table那样快。

library(data.table)
library(purrr)

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

这使我可以获得该组的摘要统计信息:


#       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
Run Code Online (Sandbox Code Playgroud)

但是说我想按组找到均值-用!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
Run Code Online (Sandbox Code Playgroud)

这将是为一个聚类(setosa)和一个标记(Petal.Length)找到它的一种方法,但是我看不到如何扩大它。

Col*_*ole 5

这是你想要的吗?

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
Run Code Online (Sandbox Code Playgroud)

要了解发生了什么,此代码有助于运行:

molten_dt[, print(.BY), by = .(Species, variable)]
Run Code Online (Sandbox Code Playgroud)