我的数据框架如下所示
ID score obs
1 0 a
1 11 b
1 12 c
2 1 d
2 11 e
2 2 f
3 0 g
3 0 h
3 0 i
我需要确保每个人的得分都高于10.如果一个人的得分不高于10,则需要删除personID显示的所有行。 10以上的最低分需要进入新栏目,相应的障碍也需要进入新栏目(*注意:没有一个人有两个相同分数的情况)。结果应如下所示:
ID score obs nScore nObs
1 0 a 11 b
1 11 b 11 b
1 12 c 11 b
2 1 d 11 e
2 11 e 11 e
2 2 f 11 e
理想情况下,还应删除每个重复的personID,以便将最低分数保留在分数列中。结果如下:
ID score obs nScore nObs
1 0 a 11 b
2 1 d 11 e
如果你能帮助我得到第一个结果,我会很高兴的。如果你能帮助我得到第二个结果,我不要求你告诉我如何在得到第二个结果之前得到第一个结果(比如你只需一步完成第二个结果)。
答案 0 :(得分:2)
假设data.frame
被称为d
,使用aggregate
,merge
和subset
# get lowest score greater than 10 per id
lowest10 = aggregate(score~ID, subset(d, score>10), FUN=min);
lowest10 = merge(lowest10, d, by=c("ID", "score"));
names(lowest10) = c("ID", "nScore", "n0bs");
# get lowest score per id
lowest = aggregate(score~ID, subset(d, ID%in%lowest10$ID), FUN=min);
lowest = merge(lowest, d, by=c("ID", "score"));
# merge the informations
newD = merge(lowest, lowest10, by="ID");
答案 1 :(得分:2)
您可以尝试dplyr
#Q1
DF1=DF%>%group_by(ID)%>%mutate(nScore=min(score[score>10]))%>%filter(!is.infinite(nScore))%>%mutate(nObs=obs[score==nScore])
# A tibble: 6 x 5
# Groups: ID [2]
ID score obs nScore nObs
<int> <int> <chr> <dbl> <chr>
1 1 0 a 11 b
2 1 11 b 11 b
3 1 12 c 11 b
4 2 1 d 11 e
5 2 11 e 11 e
6 2 2 f 11 e
#Q2
DF1%>%group_by(ID)%>%slice(which.min(score))
# A tibble: 2 x 5
# Groups: ID [2]
ID score obs nScore nObs
<int> <int> <chr> <dbl> <chr>
1 1 0 a 11 b
2 2 1 d 11 e