我有一个包含许多变量的数据框 Fix ,其中有CURRENT_ID,它是数字,介于1和不同的数字之间(例如,在某些情况下为12,在其他15中,等等,还有一个名为 nitem 的变量,它代表我实验中项目的编号。对于每个试验和每个主题,我想确定最小和最大CURRENT_ID。然后我想创建一个名为 Remove 的新变量。在删除中,如果CURRENT_ID是每个试验和参与者的最小值或最大值,则我希望值为1,对于所有其他行,值为0。以下是我拥有的数据和我想要获得的输出的示例:
SESSION_LABEL TRIAL_INDEX CURRENT_ID nitem OUTPUT
ppt01 1 1 4 1
ppt01 1 1 4 1
ppt01 1 4 4 0
ppt01 1 2 4 0
ppt01 1 2 4 0
ppt01 1 2 4 0
ppt01 1 4 4 0
ppt01 1 5 4 0
ppt01 1 6 4 0
ppt01 1 7 4 0
ppt01 1 8 4 0
ppt01 1 10 4 0
ppt01 1 11 4 0
ppt01 1 11 4 0
ppt01 1 12 4 0
ppt01 1 13 4 0
ppt01 1 13 4 0
ppt01 1 14 4 1
ppt01 1 1 4 1
ppt01 1 1 4 1
ppt01 2 2 2 0
ppt01 2 1 2 1
ppt01 2 5 2 0
ppt01 2 3 2 0
ppt01 2 4 2 0
ppt01 2 5 2 0
ppt01 2 5 2 0
ppt01 2 5 2 0
ppt01 2 6 2 0
ppt01 2 7 2 0
ppt01 2 8 2 0
ppt01 2 10 2 0
ppt01 2 10 2 0
ppt01 2 11 2 0
ppt01 2 13 2 0
ppt01 2 13 2 0
ppt01 2 13 2 0
ppt01 2 14 2 1
ppt01 2 3 2 0
ppt01 2 2 2 0
ppt01 2 1 2 1
ppt01 2 1 2 1
ppt01 2 1 2 1
ppt01 2 5 2 0
ppt01 2 4 2 0
ppt01 2 4 2 0
ppt01 2 5 2 0
ppt01 2 7 2 0
ppt01 2 9 2 0
ppt01 2 10 2 0
ppt01 2 12 2 0
ppt01 2 10 2 0
ppt01 2 10 2 0
ppt01 2 4 2 0
ppt01 2 5 2 0
ppt01 2 4 2 0
ppt01 2 6 2 0
ppt04 2 1 8 1
ppt04 2 1 8 1
ppt04 2 2 8 0
ppt04 2 3 8 0
ppt04 2 4 8 0
ppt04 2 5 8 0
ppt04 2 6 8 0
ppt04 2 7 8 0
ppt04 2 8 8 0
ppt04 2 7 8 0
ppt04 2 6 8 0
ppt04 2 8 8 0
ppt04 2 8 8 0
ppt04 2 10 8 0
ppt04 2 9 8 0
ppt04 2 10 8 0
ppt04 2 13 8 0
ppt04 2 14 8 1
ppt04 2 14 8 1
ppt04 2 1 8 1
ppt04 3 2 10 0
ppt04 3 2 10 0
ppt04 3 2 10 0
ppt04 3 3 10 0
ppt04 3 2 10 0
ppt04 3 4 10 0
ppt04 3 5 10 0
ppt04 3 6 10 0
ppt04 3 7 10 0
ppt04 3 9 10 0
ppt04 3 11 10 0
ppt04 3 12 10 0
ppt04 3 12 10 0
ppt04 3 13 10 0
ppt04 3 14 10 1
ppt04 3 14 10 1
这是我的尝试。
for (j in 1:nrow(Fix)){
Fix$Remove[j] <-ifelse(by(Fix$CURRENT_ID, list(Fix$SESSION_LABEL,Fix$nitem), max), 1,
ifelse(by(Fix$CURRENT_ID, list(Fix$SESSION_LABEL,Fix$nitem), min), 1,0))
}
此外,我不确定for循环是否是最好的一天。
答案 0 :(得分:0)
使用dplyr
:
library(dplyr)
your_data %>%
group_by(SESSION_LABEL, nitem) %>%
mutate(Remove = ifelse(
CURRENT_ID == min(CURRENT_ID) | CURRENT_ID == max(CURRENT_ID),
1, 0
))
答案 1 :(得分:0)
你可以使用基地R
:
Fix <- within(Fix, {
mx <- ave(CURRENT_ID, SESSION_LABEL, nitem, FUN=max)
mn <- ave(CURRENT_ID, SESSION_LABEL, nitem, FUN=min)
Remove <- ifelse(CURRENT_ID==mx | CURRENT_ID==mn, 1, 0)
})
但是用你的数据测试结果会给出:
which(Fix$Remove!=Fix$OUTPUT)
# [1] 78 79 80 82