问题描述
我在这个问题上挣扎了很长时间,我在互联网上进行了广泛的查找,但始终没有找到解决方案。假设我有以下数据集:
df <- data.frame("Individuals" = c(1,2,3,4,5,6),"Height" = c(150,200,150,150),"Weight" = c(100,50,100,100))
这个数据集有 6 个人。对于每个人,我们测量两个属性:身高(取值为 150 厘米或 200 厘米)和体重(取值为 50 公斤和 100 公斤)。我想创建一个分类变量,将身高和体重相等的个人归类在一起。在这种情况下,这个变量看起来像这样:
output_df <- data.frame("Individuals" = c(1,100),"Groups of individuals" = c(1,1))
有四组个体在两个变量中都具有相同的值。第 1 组中,所有人的身高 = 150 和体重 = 100,第 2 组中所有人的身高 = 200 和体重 = 50,第 3 组中所有人的身高 = 200 和体重 = 100 公斤(该组中只有一个人,但这仍然是一个单独的“个体组”,因为与其他组相比,它具有不同的其他变量值组合),并且在第 4 组中,所有的身高都为 150 厘米,体重为 50 公斤(相同至于第三组,这个组只有一个人)。
在这种情况下,很容易手动进行此分类,从而创建变量“个体组”。 现在想象一下,除了身高和体重之外,我还有更多变量,我想创建变量“个人群体”,而无需事先知道身高和体重(以及其他变量,如果存在)的可能值。所以我想创建一个新变量,其值取决于给定观察值是哪组观察值。观察组由等式条件定义;即,一个观察被归类为属于一组给定的观察,其多个变量的值完全相等。
我发现以一般的方式写下定义这个新变量的条件极其困难。此变量采用的值数量是先验未知的(取决于您拥有的特定个人集)。它有一个理论最小值或 1(所有观察值对所有变量都有相同的值)和一个理论最大值等于观察值的数量(所有观察值对所有变量都有不同的值,不存在对不同变量具有相同值的个体组) .在我的应用程序中,我想为不同的数据集创建这个变量,因此每个数据集都有不同数量的值。
我最好的尝试是在 tidyverse 中使用 group_by() 和 case_when()。我认为必须有一种方法可以将其表达为 if_else 语句或某种其他类型的条件语句。另一个直觉是,创建此变量可能需要进行某种旋转、创建变量,然后再次返回(也在 tidyverse 中:https://tidyr.tidyverse.org/articles/pivot.html)。我认为这个想法对我来说具有挑战性的原因是您创建了一个变量,该变量为每个观察值采用由跨观察值的相等条件定义的给定值,而不是变量,这让我非常困惑。这就是为什么我猜它可以通过旋转来完成,因为我认为人们可以将这个问题转换为首先创建一个变量作为其他变量的函数,然后再回到一个数据集,其中该变量是观察之间的相等性。
我真的希望问题的表述不要太混乱。我觉得这个问题让我自己很困惑,也很难表达出来。我想如果我能更好地表达它,我也许能解决它。
非常感谢!
解决方法
一种方法是创建一个结合 Height 和 Weight 值的唯一键,并使用 match
和 unique
来获取组号。
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
中的 dplyr
。
library(dplyr)
df <- df %>% group_by(Height,Weight) %>% mutate(group = cur_group_id())