【发布时间】:2017-12-08 18:08:39
【问题描述】:
我想进行一个非常复杂的循环。我有多个区域,每个区域在我的真实数据框中都有数百个图。我想按区域划分子集,然后在子集上绘制和执行各种函数,以最终计算出仅归因于共享物种的差异。我将首先说每一行都代表一个交互。
我的例子df:
set.seed(540)
df<- data.frame(region= c(rep(1, 16), rep(2,8)),
plot= c(rep("A",5), rep("B",9), rep("C", 2), rep("D", 6),rep("E", 2)),
plantsp= sample(1:24,24, replace= TRUE),
lepsp= sample(1:24,24,replace= TRUE),
psitsp= sample(1:24,24,replace= TRUE))
df[] <- lapply(df, as.character)
df$plantsp<-paste('plantsp', df$plantsp, sep='_')
df$lepsp<-paste('lepsp', df$lepsp, sep='_')
df$psitsp<-paste('psitsp', df$psitsp, sep='_')
df$paste1<- paste(df$plantsp, df$lepsp, sep='_')
df$paste2<- paste(df$lepsp, df$psitsp, sep='_')
df$paste3<- paste(df$plantsp,df$lepsp, df$psitsp)
步骤 1:按区域对 df 进行子集。示例:
region_sub <- split(df, df$region)
步骤 2:按图对 df 进行子集。示例:
plot_sub <- split(region_sub[[1]], region_sub[[1]][[2]])
Step3:我们将上述步骤中的每个子集(每个列表组件)称为绘图子集。在此示例中,我将使用第一个子集 (region1, plotA) 作为所有后续输出的示例。我将调用这个 region1,plotA 子集plot_sub1。我想将plot_sub1 与原始df 进行比较,以生成三个df 子集。我们将它们称为df_sub1、df_sub2、df_sub3。首先,df_sub1 包含plantsp、lepsp 列中plot_sub1 和df 中的条目之间的匹配。删除具有任何唯一条目的行,以及匹配 plantsp 但不匹配 lepsp 的行,反之亦然。 df_sub1 示例:
df_sub1<- df[c(1,2,3,4,5,22),c(1:4,6)]
请注意,仅保留那些具有共享物种的行。此外,只有那些具有共享物种并且也相互作用的行仍然存在。另外,我删除了不必要的列(例如psitsp、paste2、paste3),以提醒您注意此步骤的结果。不需要为代码删除这些列。
第 4 步:对 lepsp 和 psitsp 列重复第 3 步以生成 df_sub2。示例:
df_sub2<- df[1:5,c(1:2,4,5,7)]
步骤 5:对 plantsp、lepsp 和 psitsp 列重复步骤 3,以生成 df_sub3。示例:
df_sub3<- df[1:5,c(1:5,8)]
Step6: 现在所有子集都制作好了,我想计算plot_sub1 和df_sub1 (=5) 中paste1 列中的匹配元素。例子:
这将存储在向量match 中。结果将相应地存储在匹配或唯一向量中。示例:
match<- length(intersect(df_sub1$paste1, plot_sub[[1]]$paste1))
match
我还想计算唯一元素 (=1)。这将存储在向量unique 中。这将对plot_sub1 和df_sub2 和plot_sub1 和df_sub3 重复。我不确定如何计算两个 df 中的唯一元素,因此我无法提供示例代码。
unique<- 1
注意:df_sub 重复交互或匹配时,plot_sub 之间的匹配只需要计算 1 次。这需要考虑匹配的存在 - 不存在,而不是丰富。
对于这个子集,这两个向量将是:
match<- c( length(intersect(df_sub1$paste1, plot_sub[[1]]$paste1)),
length(intersect(df_sub2$paste2, plot_sub[[1]]$paste2)),
length(intersect(df_sub3$paste3, plot_sub[[1]]$paste3))
match
unique<-c(1,0,0)
然后将对每个向量求和。示例:
sum_match<- 15
sum_unique<- 1
Step7:最后,将这些值输入到函数中:
((a + b)/((2*a + b)/2) - 1) 其中 a= sum_match 和 b=sum_unique。
然后将该值输入到结果向量res_vec。
步骤 8:这个过程(步骤 3-7)将针对每个绘图子集进行迭代。
实际上,这将计算情节交互和相应元网络(所有可能的交互)之间共享交互的差异。这是对 (Poisot et al 2012) 的修改,以解释三养相互作用。
这很可悲,但要启动 for 循环我有:
res_vec<- NA
for (i in 1:length(unique(df$region)))
{
for (j in 1:length(unique(df$plot)))
{
我真的很感激有人愿意帮助我实现循环中的论点。这就是让我感到棘手的地方。
【问题讨论】:
-
我很欣赏这个可重现的例子,但我对
df_sub1的逻辑感到困惑。在您的示例中,您说df_sub1应该包括df的第22 行,其中包含plantsp_9和“lepsp_2”。但是,plot_sub1中的任何行都没有这两个值。因此,我不明白为什么df[22, ]包含在df_sub1中。此外,df[16, ]有plantsp_21和lepsp_19,与plot_sub1[2, ]完全匹配,所以我也不明白为什么df[16, ]不包含在df_sub1中。 -
也许它与“删除任何唯一条目的行”有关,在这种情况下我也不明白,因为
df[c(1,2,3,4,5,22),c(1:4,6)]的所有行都是唯一的,并且在 @987654386 内@列只有plantsp_9重复,其他四个值在df_sub1内是唯一的 -
感谢您提出的问题,而不是放弃我的问题!你的问题很好,为什么我的分析(在我看来)很酷。要回答您的第一个问题:在
df_sub1的第 22 行,而植物 p9 和 lepsp2 在plot_sub1中不交互,它们都在该图中找到。所以我想知道,在它们共享的物种子集中,有什么不同的相互作用。通过包含 row22,我正在考虑以不同方式相互作用的共享物种,我需要计算这些实例。 -
在我的示例中我不考虑
df[16,],因为这是情节 C 的一部分,它是循环的第三次迭代的一部分。我需要为每个绘图子集分别重复步骤 3-7(例如,在循环的下一次迭代中将是plot_sub2及其对应的df_sub1、df_sub2、df_sub3,第三次迭代是plot_sub3与其对应的df_sub1、df_sub2、df_sub3等。 -
好的,我想我对 df 第 22 行的了解更好 - 它包含在
df_sub1中,因为它的plantsp和lepsp值都出现在 @987654403 的 somewhere 中@,即使它们不在同一行中。对吗?