r:将最低值匹配条件和相应的观察添加到新列

时间:2017-08-15 15:31:04

标签: r

我的数据框架如下所示

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

如果你能帮助我得到第一个结果,我会很高兴的。如果你能帮助我得到第二个结果,我不要求你告诉我如何在得到第二个结果之前得到第一个结果(比如你只需一步完成第二个结果)。

2 个答案:

答案 0 :(得分:2)

假设data.frame被称为d,使用aggregatemergesubset

# 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