R表示分数是否达到该点的最佳值的新列

时间:2017-01-26 16:13:12

标签: r dplyr

假设我有这样的数据集:

df <- data.frame(id = c(1, 1, 1, 2, 2),
                 score = c(0, 3, 2, 3, 3))  

即,

   id score 
1   1   0   
2   1   3 
3   1   2
4   2   3
5   2   3

如果在该行上的得分是数据集中该点之前的所有得分中的最佳(最大),则如何添加“是”的新列,否则为“否”。所以,我希望它回归:

   id score improvement
1   1   0        No
2   1   3        Yes
3   1   2        No
4   2   3        No
5   2   3        No

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以轻松地使用dplyr这样做。

library(dplyr)

 df %>% 
  group_by(id) %>% 
  mutate(max_score = ifelse(score == max(score) & min_rank(score) > 1, "Yes", "No"))

Source: local data frame [5 x 3]
Groups: id [2]

     id score max_score
  <dbl> <dbl>     <chr>
1     1     0        No
2     1     3       Yes
3     1     2        No
4     2     3        No
5     2     3        No

编辑:已修复以匹配预期输出。

答案 1 :(得分:3)

根据预期的输出,这可能有帮助

library(data.table)
i1 <- setDT(df)[, improvement := "No"
       ][, .I[uniqueN(score)>1 & score==max(score)], id]$V1
df[i1, improvement := "Yes"]
df
#    id score improvement
#1:  1     0          No
#2:  1     3         Yes
#3:  1     2          No
#4:  2     3          No
#5:  2     3          No

说明

逻辑不明确。但是,似乎OP想要创建“改进”专栏,其中“是”仅适用于那些拥有多个“得分”并且其中包含最大score的“id”,而“id”则为“在这种情况下,2'具有相同的“得分”,因此保留为“否”。

在上面的解决方案中,我们将'data.frame'转换为'data.table'(setDT(df)),创建一个只有“No”值的“改进”列,然后获取行索引({对于那些拥有多个.I'得分'(unique)和(uniqueN(score)>1)并且'得分'是最大值的人{{}},我会按'id'分组{{}} {1}})。在&上使用此功能,我们将(score == max(score))“改进”分配给“是”

答案 2 :(得分:1)

以下是基础R解决方案:

df$improvement <- factor(ave(df$score, df$id,
                            FUN=function(i) c(Inf, head(cummax(i), -1)) < i),
                         labels=c("No", "Yes"))

第一次观察始终为“否”的想法,即通过预先填充Inf,然后cummax来实现,以查看先前观察是否有改进。 ave允许此操作在组上进行。我将结果包含在factor中,用yes / no标签表示值。