用于循环以拆分和合并不起作用的数据框

问题描述

我写了一段很长的代码,从本质上讲,它会根据列的值拆分一个数据帧,然后创建一个新的数据帧。我想使用此列的10个值,但是我尝试的所有事情(例如,创建函数或for循环)都停滞在某个地方。

首先,我根据物种身份将df子集df

ca<-df[df$species ==ca & !is.na(df$species),]

这是头(ca)

 species       pot  A      B       C N   A.1      B.1   C.1  
1         CA 121 -34.99 -36.08 -36.10    NA     NA     NA     
2         CA  122 -35.75 -35.29 -35.77    NA     NA     NA     
3         CA  123 -36.94 -35.88 -36.17    NA     NA     NA     
4         CA  124 -35.89 -34.69 -35.54    NA     NA     NA     
5         CA  125 -35.91 -34.90 -35.85    NA     NA     NA     
6         CA  126 -35.99 -36.24 -35.44    NA     NA     NA  

ca的尾巴是

       species pot      A      B     C NA_NA   A.1    B.1    C.1
15         CA 135     NA     NA     NA    NA -14.47 -27.88 -37.09
16         CA 136     NA     NA     NA    NA -13.57     NA -36.39
17         CA 137     NA     NA     NA    NA -14.52 -29.51 -36.54
18         CA 138     NA     NA     NA    NA -13.53 -32.35     NA
19         CA 139     NA     NA     NA    NA -14.34 -31.20 -36.49
20         CA 140     NA     NA     NA    NA -14.03 -32.34 -36.51

我编写了以下代码,这些代码对于我的最终目标是成功的:

                      y = CA$pot[ ! is.na(CA$A.1)],all.x = TRUE,all.y = TRUE) %>% 
    transmute(A.pot = x,B.pot = y) %>%
    merge(y = CA[ ! is.na(CA$A),c("pot","A","B","ACMI_C")],by.x = "A.pot",by.y = "pot") %>%
    merge(y = CA[ ! is.na(CA$A.1),"A.1","B.1","C.1")],by.x = "B.pot",by.y = "pot")%>%
    mutate(H=(B.1-B)/(A.1 - A))

但是,我有10种不同的物种身份,并且需要为每次迭代运行工作流(例如,对于df $ species中的i),但不允许我使用以下代码进行操作

for(i in df$species){
species<-df[df$species =="i" & !is.na df$species],species.index <- merge(x = species$pot[ ! is.na(species$A)],y = species$pot[ ! is.na(species$A.1)],all.y = TRUE) 
}

我对此并不陌生,所以任何帮助都会很棒。我还尝试创建一个函数,但没有成功。

谢谢!

解决方法

在这里,i是每个“物种”的值,也应该是unique。子集发生在文字“ i”上,而不是i

un1 <- levels(df$species)
species_list <- vector('list',length(un1))
for(i in seq_along(un1)){
  species <- df[df$species == un1[i] & !is.na df$species),],species_list[[i]] <- merge(x = species[!is.na(species$A),y = species[!is.na(species$A.1),all.x = TRUE,all.y = TRUE) 
  }