我的目标是在
我的data.frame,以包括R中一列中可能的组合(但不是所有可能的组合)。类似于R
中扩展扩展.grid
命令,但该函数为您提供了所有可能的组合,而不仅仅是现有的组合。
首先,我需要按第1列中的每个因素进行分组,并保留第2列中包含的信息。在第3列中,我有动物名称的字符串。我想逐行查找该列中出现的每个可能的对(但不是所有可能的对)。例如,如果我在前两排有恐惧之翼和Scorcher,那将是一对:恐惧之翼-Scorcher——它不应该包括Scorcher-恐惧之翼。然而,如果第4行和第5行是霸王龙和霸王龙,这对应该出现一次:霸王龙-T-Rex,因为霸王龙出现在动物栏的两个单独的行中。如果霸王龙出现在三排,那么这对霸王龙应该出现三次,等等。
最后,对应该将data.frame扩展2列以存储对。换言之,“恐惧之翼”和“Scorcher”应该各自在各自独立的列中,但在同一行中。
我已经手动将这张图片放在一起,以显示我的输出应该来自我所拥有的数据帧(注意:Area_1和Area_2被分开只是为了在一个屏幕截图中显示结果)。左边:我在第一排放了箭头,显示了想要的组合,无畏翼。右边:所有Area_1和Area_2的期望结果。
对于期望的结果,对于Area_1,不应出现Dreadwing-Dreadwing对,因为对于Area_2,Dreadwings不出现在任何其他行中。然而,霸王龙出现在两个单独的行中,因此霸王龙-T-Rex的组合应该存在,以及每行霸王龙与每行水翼的组合。因此,4个T-Rex-Waterwing组合。
可复制数据
创建数据帧
v <- c(rep("Area_1", 7), rep("Area_2", 7))
w <- c(rep("Forest", 7), rep("Cave", 7))
y <- c("Waterwing", "Scorcher", "Snapmaw", "T-Rex", "T-Rex", "Dreadwing",
"Waterwing", "Snake", "T-Rex", "T-Rex", "Dreadwing", "Snapmaw", "Scorcher",
"Waterwing")
stack_df <- data.frame(Area = v, Location = w, Animals = y)
stack_df <- stack_df[order(stack_df$Area, stack_df$Location, stack_df$Animals), ]
row.names(stack_df) <- 1:nrow(stack_df)
使用tidyR指南,我发现命令expand
与嵌套
命令(仅保留数据中出现的组合)结合使用是不起作用的。例如:
library(tidyr)
stack_df %>%
dplyr::group_by(Area) %>%
expand(nesting(Location, Animals, Animals))
将仅返回11/14行。
我已经尝试了多种使用expand
和crossing
命令的方法。但是,与expand.grid
命令一样,这些命令提供了所有可能的组合。
尽管如此,使用expand
命令是我最接近目标的方法。
stack_df %>%
dplyr::group_by(Area) %>%
expand(Location, Animals, Animals)
正如你所看到的,所有的可能性都包括在内,这不是想要的结果。
关于我该怎么做有什么想法吗?