创建一个变量,将观察值分类为由其他变量值的相等条件定义的观察值组

Create a variable that classifies observations in groups of observations defined by equality conditions of values for other variables

这个问题我纠结了好久,网上也找了好久都没找到解决办法。假设我有以下数据集:

  df <- data.frame("Individuals" = c(1,2,3,4,5,6),         
        "Height" = c(150, 200, 200, 200, 150, 150),
        "Weight" = c(100, 50, 50, 100, 50, 100))

这个数据集有 6 个个体。对于每个人,我们测量两个属性:身高(取值 150 厘米或 200 厘米)和体重(取值 50 公斤和 100 公斤)。我想创建一个分类变量,将身高 体重相等的个体分类在一起。在这种情况下,该变量将如下所示:

  output_df <- data.frame("Individuals" = c(1,2,3,4,5,6),         
        "Height" = c(150, 200, 200, 200, 150, 150),
        "Weight" = c(100, 50, 50, 100, 50, 100),
        "Groups of individuals" = c(1, 2, 2, 3, 4, 1))

有四组个体在两个变量中具有相同的值。在第 1 组中,所有身高 = 150 且体重 = 100,在第 2 组中,所有身高 = 200 且体重 = 50,在第 3 组中,所有身高 = 200 且体重 = 100 kg(该组中只有一个人,但这仍然是一个单独的“个体组”,因为与其他组相比,它具有其他变量值的不同组合)并且在第 4 组中,所有身高均为 150 厘米,体重为 50 公斤(相同至于第三组,这个组只有一个人)。

在这种情况下,很容易手动进行此分类,从而创建变量“Group of individuals”。 现在假设除了身高和体重之外我还有更多变量,并且我想在事先不知道身高和体重(以及其他变量,如果存在的话)的可能值的情况下创建变量“个体组”。所以我想创建一个新变量,其值取决于给定观察是哪一组观察。观察组由相等条件定义;即,一个观察被归类为属于给定的一组观察,这些观察的几个变量的值完全相等。

我发现很难以一般化的方式写下定义这个新变量的条件。这个变量所取值的数量是先验未知的(取决于你拥有的特定人群)。它有一个理论上的最小值或 1(所有观察值对所有变量都有相等的值)和一个理论上的最大值等于观察值的数量(所有观察值对所有变量都有不同的值,不存在对不同变量具有相等值的个体组) .在我的应用程序中,我想为不同的数据集创建这个变量,因此每个数据集的值数量不同。

我最好的尝试是在 tidyverse 中使用 group_by() 和 case_when()。我假设必须有一种方法可以将其表达为 if_else 语句或其他类型的条件语句。另一个直觉是,创建这个变量可能需要某种旋转,创建变量,然后再次旋转回来(也在 tidyverse 中: https://tidyr.tidyverse.org/articles/pivot.html )。我认为这个想法对我来说具有挑战性的原因是你创建了一个变量,每个观察值都采用一个给定值,该值由观察值之间的相等条件定义,而不是变量,这让我很困惑。这就是为什么我猜它可以通过旋转来完成,因为我认为有人可以将这个问题转化为首先创建一个变量作为其他变量的函数,然后返回到一个数据集,其中这个变量是以下函数的函数观察之间的平等。

我真的希望问题的表述不会太混乱。我觉得这个问题让我自己很困惑,也很难表达出来。我想,如果我能表达得更好,我也许能解决它。

非常感谢!

一种方法是创建一个结合身高和体重值的唯一键,并使用 matchunique 获取组号。

key <- with(df, paste(Height, Weight, sep = '-'))
df$group <- match(key, unique(key))
df
#  Individuals Height Weight group
#1           1    150    100     1
#2           2    200     50     2
#3           3    200     50     2
#4           4    200    100     3
#5           5    150     50     4
#6           6    150    100     1

如果组的顺序不重要,只关心身高体重一样的人组号一样,我们也可以用cur_group_id from dplyr.

library(dplyr)
df <- df %>% group_by(Height, Weight) %>% mutate(group = cur_group_id())