假设我有这样的数据集:
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
感谢您的帮助!
答案 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标签表示值。