基于数据帧中的二进制列,通过R对列中的闭合值进行子集设置
我有一个数据框,包含85行35列,根据年龄列进行排序,如下所示:基于数据帧中的二进制列,通过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
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))