基于数据帧中的二进制列,通过R对列中的闭合值进行子集设置

基于数据帧中的二进制列,通过R对列中的闭合值进行子集设置,r,dataframe,R,Dataframe,我有一个数据框,包含85行35列,根据年龄列进行排序,如下所示: No Gender Age 1 F 5.8 2 F 5.9 3 F 6 4 M 6.2 5 F 7 6 F 7.2 7 M 7.4 8 M 7.8 9 M 7.9 10 M 8.1 11 F 8.3 12 F 8.6 13 M 8.9 14 M 9 15 F 9.2 16 F 9.3 No Gender Ag

我有一个数据框,包含85行35列,根据年龄列进行排序,如下所示:

No  Gender  Age
1   F   5.8
2   F   5.9
3   F   6
4   M   6.2
5   F   7
6   F   7.2
7   M   7.4
8   M   7.8
9   M   7.9
10  M   8.1
11  F   8.3
12  F   8.6
13  M   8.9
14  M   9
15  F   9.2
16  F   9.3
No  Gender  Age
1   F   6
2   M   6.2
3   F   7.2
4   M   7.4
5   M   8.1
6   F   8.3
7   F   8.6
8   M   8.9
9   M   9
10  F   9.2
我需要将最接近的年龄划分为不同性别。如下图所示:

No  Gender  Age
1   F   5.8
2   F   5.9
3   F   6
4   M   6.2
5   F   7
6   F   7.2
7   M   7.4
8   M   7.8
9   M   7.9
10  M   8.1
11  F   8.3
12  F   8.6
13  M   8.9
14  M   9
15  F   9.2
16  F   9.3
No  Gender  Age
1   F   6
2   M   6.2
3   F   7.2
4   M   7.4
5   M   8.1
6   F   8.3
7   F   8.6
8   M   8.9
9   M   9
10  F   9.2

好的,我想我明白了。这是令人惊讶的困难,也许其他人能够想出一个更优雅的解决方案,但我得到的是:

df <- data.frame(No=c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L,14L,15L,16L),Gender=c('F','F','F','M','F','F','M','M','M','M','F','F','M','M','F','F'),Age=c(5.8,5.9,6,6.2,7,7.2,7.4,7.8,7.9,8.1,8.3,8.6,8.9,9,9.2,9.3),stringsAsFactors=F);
mls <- df$Gender=='M';
mages <- df$Age[mls];
fages <- df$Age[!mls];
fisLower <- findInterval(mages,fages);
TOL <- 1e-5;
fisClosest <- fisLower+ifelse(fisLower==0L | fisLower<length(fages) & mages-fages[replace(fisLower,fisLower==0L,NA)]>fages[fisLower+1L]-mages+TOL,1L,0L);
mis <- unname(tapply(seq_along(mages),fisClosest,function(is) is[which.min(abs(mages[is]-fages[fisClosest[is[1L]]]))]));
fis <- unique(fisClosest);
df[sort(c(which(mls)[mis],which(!mls)[fis])),];
##    No Gender Age
## 3   3      F 6.0
## 4   4      M 6.2
## 6   6      F 7.2
## 7   7      M 7.4
## 10 10      M 8.1
## 11 11      F 8.3
## 12 12      F 8.6
## 13 13      M 8.9
## 14 14      M 9.0
## 15 15      F 9.2

我认为您在预期输出中错过了
f7.0
行;除此之外,这将获得相同的行集。如果您想将
No
设置为从1开始的顺序,您可以运行
df2$No,因为您的条件不清楚。你所说的“最近的”是什么意思?@Sotos:例如,相近的年龄段想要RWO 3和4,而不是1和4。6和6.2比5.8和6.2更接近。啊……好的。我明白了,我不确定我是否明白你的意思,但它是像示例一样排序的,最大值并不重要,只是封闭年龄很重要。女性的最大值是13.3,男性的最大值是18.3谢谢你的帮助,但这对我没有帮助。我需要像我写的那样的输出。每个性别中最接近的年龄。问你:你能看看
data.frame(性别=c('F','M','M','M','F'),年龄=c(5,11,12,13,14))
并告诉我该测试用例的预期输出是什么吗?结果是:data.frame(性别=c('M','F'),年龄=c(13,14))