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

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

提问人:Carlos González Poses 提问时间:7/30/2021 更新时间:7/30/2021 访问量:574

问:

我一直在为这个问题而苦苦挣扎,我在网上广泛寻找,但从未找到解决方案。想象一下,我有以下数据集:

  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 公斤(该组中只有一个个体,但这仍然是一个单独的“个体组”,因为它与其他组相比具有其他变量的值组合),而在第 4 组中,所有个体都有身高 150 厘米,体重 50 公斤(与第 3 组相同,该组中只有一个人)。

在这种情况下,很容易手动进行此分类,从而创建变量“个人组”。 现在想象一下,除了身高和体重之外,我还有更多变量,我想创建变量“一群人”,而事先不知道身高和体重(以及其他变量,如果存在)的可能值。因此,我想创建一个新变量,其值取决于给定观测值是哪一组观测值。观测值组由相等条件定义;也就是说,一个观测值被归类为与一组给定的观测值有关,这些观测值在多个变量中的值完全相等。

我发现以概括的方式写下定义这个新变量的条件非常困难。这个变量取的值的数量是先验的(取决于你所拥有的特定个体集)。它有一个理论最小值或 1(所有观测值对所有变量的值相等)和一个理论最大值等于观测值数(所有观测值对所有变量都有不同的值,没有一组个体对不同变量具有相等的值)。在我的应用程序中,我想为不同的数据集创建此变量,因此每个数据集将具有不同数量的值。

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

我真的希望任务的表述不要太混乱。我发现这个问题让自己感到困惑,以至于也很难表达出来。我想如果我能更好地表达它,我也许能够解决它。

非常感谢!

r 变量 条件语句 相等

评论


答:

1赞 Ronak Shah 7/30/2021 #1

一种方法是创建一个唯一的键,将身高和体重值组合在一起,并使用和获取组号。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

如果组的顺序不重要,您只关心相同身高和体重的人获得相同的组号,我们也可以使用 from .cur_group_iddplyr

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

评论

0赞 Carlos González Poses 7/30/2021
是一个很好的答案。尤其是 dplyr 解决方案:如此简单,我喜欢它。谢谢!