Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何选择具有两个特定条件的行,其中一个条件取决于另一个条件的值_R - Fatal编程技术网

R 如何选择具有两个特定条件的行,其中一个条件取决于另一个条件的值

R 如何选择具有两个特定条件的行,其中一个条件取决于另一个条件的值,r,R,您好,我有一个类似这样的数据框(实际的数据框有更多的行和更多的列,但这些是我现在特别关注的列): 我试图选择一行,该行包含雄性交配的第一个配偶的ID。我想选择在给定年份内具有最低年份值和最低配对数的行,因此我试图确保选择第一行和第三行 我尝试过以下代码: d <- ddply(dataframe, .(Male_ID), summarise, Year = min(Year), Pair_Number = min(Pair_Number)) results

您好,我有一个类似这样的数据框(实际的数据框有更多的行和更多的列,但这些是我现在特别关注的列):

我试图选择一行,该行包含雄性交配的第一个配偶的ID。我想选择在给定年份内具有最低年份值和最低配对数的行,因此我试图确保选择第一行和第三行

我尝试过以下代码:

        d <- ddply(dataframe, .(Male_ID), summarise, Year = min(Year), Pair_Number = min(Pair_Number))
        results <- left_join(d, dataframe, by = c("Male_ID", "Year", "Pair_Number))
第1行正确,但第二行不正确。1988年,男性E没有一个配对数等于1

我想要这个:

          Male_ID   Year  Pair_Number
       1        A   1987            1
       2        E   1988            2
谢谢

试试看:

df %>% 
  group_by(Male_ID, Year) %>% 
  filter(Pair_Number == min(Pair_Number)) %>% 
  ungroup() %>% 
  distinct(Male_ID, .keep_all = TRUE)
其中:

# A tibble: 2 x 4
  Male_ID Mate_ID  Year Pair_Number
   <fctr>  <fctr> <int>       <int>
1       A       B  1987           1
2       E       D  1988           2
#一个tible:2 x 4
男性身份证配偶身份证年份配对号
1 A B 1987 1
2 E D 1988 2
  • 男性ID
    年份进行分组
  • 按最小
    对编号过滤这些组
  • 解组
  • 返回每个不同的
    男性ID的第一行

  • 仅使用
    base R

    首先是数据集

    dataframe <- read.table(text = "
      Male_ID   Mate_ID  Year  Pair_Number
      1        A         B  1987            1
      2        A         C  1987            2
      3        E         D  1988            2
      4        E         F  1990            1
    ", header = TRUE)
    

    然后是代码的其余部分。但是我发现可读的代码更好。

    使用
    dplyr
    并将所有变量保留在最终结果中(如果需要可以删除):

    df%
    分组人(男性ID)%>%
    排列(年份,配对编号,.by\u group=TRUE)%>%
    切片(1)
    #>#A tibble:2 x 4
    #>#组:男性#ID[2]
    #>男性身份证配偶身份证年份配对号
    #>                
    #>1 A B 1987 1
    #>2 E D 1988 2
    
    如果我理解正确,您不也要第4行吗?这一年不一样。不,因为我想找到雄性的第一个配偶。第四排并没有给我们雄性E交配的第一个配偶,而是给了他有生之年与之交配的第二个配偶,这似乎对我不起作用。执行此操作时,将删除“男性ID”列。代码也没有考虑年份或配对编号列,因此我不确定这是否适用于meAh<代码>男性ID
    不应该丢失,但是
    配偶ID
    是因为这是您想要的
    df
    的样子。我忘记了
    年份
    和最小
    配对号
    。将更新答案。@JenniferDiamond我认为它现在应该适合你了。
    # A tibble: 2 x 4
      Male_ID Mate_ID  Year Pair_Number
       <fctr>  <fctr> <int>       <int>
    1       A       B  1987           1
    2       E       D  1988           2
    
    dataframe <- read.table(text = "
      Male_ID   Mate_ID  Year  Pair_Number
      1        A         B  1987            1
      2        A         C  1987            2
      3        E         D  1988            2
      4        E         F  1990            1
    ", header = TRUE)
    
    sp <- split(dataframe, dataframe$Male_ID)
    result <- lapply(sp, function(x) x[which.min(x$Year), ])
    result <- do.call(rbind, result)
    row.names(result) <- NULL
    rm(sp)    # tidy up
    result
    #  Male_ID Mate_ID Year Pair_Number
    #1       A       B 1987           1
    #2       E       D 1988           2
    
    result <- lapply(split(dataframe, dataframe$Male_ID), function(x)
        x[which.min(x$Year), ])