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