在R中的for循环中创建一个新变量

时间:2017-03-15 19:04:26

标签: r loops max min

我有一个包含许多变量的数据框 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循环是否是最好的一天。

2 个答案:

答案 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