【问题标题】:for looping to split and merge a dataframe not working用于循环拆分和合并数据帧不起作用
【发布时间】:2020-09-12 21:24:52
【问题描述】:

我写了一段相当长的代码,本质上它根据列的值拆开一个数据框,然后创建一个新的数据框。我想使用此列的 10 个值来执行此操作,但我尝试的所有操作(例如创建函数或 for 循环)都会在某处停止。

首先我按物种身份对 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), c("pot", "A.1", "B.1", "C.1")],
          by.x = "B.pot", by.y = "pot")%>%
    mutate(H=(B.1-B)/(A.1 - A))

但是,我有 10 种不同身份的物种,并且需要为每次迭代运行工作流(即 for i in df$species),但它不允许我使用以下代码这样做

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.x = TRUE, all.y = TRUE) 
}

我是新手,所以任何帮助都会很棒。我也尝试创建一个函数,但没有成功。

谢谢!

【问题讨论】:

  • merge 部分在您的 for 循环中不清楚。它表明您正在对两个向量进行子集化而不是 data.frame

标签: r function for-loop


【解决方案1】:

这里,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) 
  }

【讨论】:

  • 啊,我明白了。不过,它告诉我 unique(df$species) 是矢量的无效长度参数
  • @Skotani1 如果您选择unique(iris$Species)levels(iris$Species) - 如果它是factor
  • 是的,它单独工作就很好,unique(df$species) 也是如此,但在向量参数中它不被接受为长度
  • 你的意思是df$species == un1[i]?试试df[df$species == un1[1] &amp; !is.na(df$species),] 作为测试
  • @Skotani1 它也应该适用于矢量iris[iris$Species == levels(iris$Species)[1],]
猜你喜欢
  • 2022-12-15
  • 1970-01-01
  • 2023-01-19
  • 2021-09-26
  • 2017-03-21
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多