【问题标题】:Determine for which ID are all conditions satisfied in R确定 R 中的所有条件都满足哪个 ID
【发布时间】:2026-01-13 17:35:01
【问题描述】:

我觉得这应该比较简单。我正在使用最新版本的 R。在数据框中,我有一列 ID 号称为 PairID,还有一列称为物种,包含 15 个不同的物种。我想知道所有 15 种的 PairID 编号。

数据框看起来像

head(analysis.df)
species     PairID
DIKDIK        1
GAZELLE       2
GIRAFFE       1
ELAND         5
GIRAFFE       3
DIKDIK        2

我的想法是运行这个:

    for(i in 1:nrow(analysis.df)) {
  if (analysis.df$species[i]=="GRANTS GAZELLE") {analysis.df$GRANTS GAZELLE[i] <- 1}
  else if (analysis.df$species[i]=="DIKDIK") {analysis.df$DIKDIK[i] <- 1 
  else if (analysis.df$species[i]=="IMPALA") {analysis.df$IMPALA[i] <- 1}
  else if (analysis.df$species[i]=="BUFFALO") {analysis.df$BUFFALO[i] <- 1}
  else if (analysis.df$species[i]=="BUSHBUCK") {analysis.df$BUSHBUCK[i] <- 1}
  else if (analysis.df$species[i]=="GIRAFFE") {analysis.df$GIRAFFE[i] <- 1}
  else if (analysis.df$species[i]=="ELAND") {analysis.df$ELAND[i] <- 1}
  else if (analysis.df$species[i]=="GERENUK") {analysis.df$GERENUK[i] <- 1}
  else if (analysis.df$species[i]=="LESSER KUDU") {analysis.df$LESSER KUDU[i] <- 1}
  else if (analysis.df$species[i]=="HARTEBEEST") {analysis.df$HARTEBEEST[i] <- 1}
  else if (analysis.df$species[i]=="STEENBOK") {analysis.df$STEENBOK[i] <- 1}
  else if (analysis.df$species[i]=="ORYX") {analysis.df$ORYX[i] <- 1}
  else if (analysis.df$species[i]=="REEDBUCK") {analysis.df$REEDBUCK[i] <- 1}
  else if (analysis.df$species[i]=="THOMSONS GAZELLE") {analysis.df$THOMSONS GAZELLE[i] <- 1}
  else if (analysis.df$species[i]=="WATERBUCK") {analysis.df$WATERBUCK[i] <- 1}

}

然后我可以尝试summary 对所有这些新创建的列中所有带有 1 的行。

但是这段代码给出了错误:

> Error: unexpected symbol in:
"for(i in 1:nrow(analysis.df)){
  if (analysis.df$species[i]=="GRANTS GAZELLE") {analysis.df$GRANTS GAZELLE"

我查看了herehere 以及R 和谷歌搜索中的一些小插曲,但到目前为止还没有破解它。我什至不确定这种方法能否满足我的需求,我很乐意看看任何建议,以实现本文开头所述的目标。

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    听起来你想做的是group你的数据by ID,然后summarize基于条件的物种成员。由于您没有提供可重现的示例,我将使用mtcars。这里我们按档数分组,然后检查carb列是否包含all提供的值(1、2、3和4):

    library(dplyr)
    mtcars %>%
        group_by(gear) %>%
        summarize(all_carb = all(c(1,2,3,4) %in% carb))
    
    # A tibble: 3 x 2
       gear all_carb
      <dbl> <lgl>   
    1     3 TRUE    
    2     4 FALSE   
    3     5 FALSE   
    

    在你的情况下,你会做这样的事情:

    analysis.df %>%
        group_by(ID) %>%
        summarize(all_species = all(species_list %in% species))
    

    假设 species_list 是一个向量,其中包含您要检查的物种的值

    【讨论】:

    • 这是完美且高效的启动
    【解决方案2】:

    试试这个:

    dplyr::filter(analysis.df, nrow(analysis.df$PairID) > 14)
    
    

    如果尚未安装和加载dplyr 包,请务必安装它。

    在您编写的代码中,您需要为任何中间有空格的列名添加反引号:"dataframe$`Column with a space`"(不包括引号)

    【讨论】:

    • 关于如何处理空格的非常有用的输入。唉,上面的答案已经足够并且更容易评估最终结果(即哪些 ID 拥有完整的物种)。
    最近更新 更多