在数据框中找到独特组合的数量以及每个组合的观测值数量。

3

这个问题是从之前的问题引申而来的。假设我们有三列或更多的数据,而不是两列。考虑以下数据。

x <- c(600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800,
       600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800,
       600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800)

y <- c(1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
       80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
       3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3)

z <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3,
       1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3,
       1, 2, 3, 1, 2, 3)

xyz <- data.frame(cbind(x, y, z))

如果我们将所有列都视为有限级别的因子。我想要得到的是每个唯一组合的x、y和z的观察数量。答案是18个唯一组合,每个组合中有3个观察值。请问如何在R中实现这一点?谢谢!


你可以尝试使用 unique(xyz) - HubertL
@HubertL 当然。这会给出唯一的组合。但我还想知道每个唯一组合中有多少观测值。请问有简单的方法吗? - LaTeXFan
2个回答

4
使用 table 或者 tabulate 来处理 interaction
tabulate(with(xyz, interaction(x,y,z)))

table(with(xyz, interaction(x,y,z)))

或者通过交互进行split并使用lengths

lengths(split(xyz, with(xyz, interaction(x,y,z))))

或者
aggregate(seq_along(x)~ x+y+z, data=xyz, FUN=length)

lengths 包属于哪个软件包? - pcantalupo

1
使用 data.table 的选项。我们将 'data.frame' 转换为 'data.table' (setDT(xyz)),按照 'xyz' 列进行分组,获取每个组中元素的数量 (.N)。
library(data.table)
setDT(xyz)[, .N, names(xyz)]$N
#[1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

或者使用dplyr,我们按列进行分组,使用summarise获取元素数量(n())。

library(dplyr)
xyz %>%
    group_by_(.dots=names(xyz)) %>%
    summarise(n=n()) %>%
    .$n
#[1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接