我有一些类似以下的数据:
UniqueID MonthYear Count2 CCount
402ABC OCT2018 5 1
402ABC NOV2018 5 2
402ABC DEC2018 5 3
402ABC JAN2019 5 4
402ABC FEB2019 5 5
495DEF FEB2019 10 1
495DEF MAR2019 10 2
495DEF APR2019 10 3
495DEF MAY2019 10 4
495DEF JUN2019 10 5
495DEF AUG2019 10 6
495DEF SEP2019 10 7
495DEF DEC2019 10 8
495DEF JAN2020 10 9
495DEF FEB2020 10 10
我想要的是能够创建一个标题为“ Corrected”的新列,该列查找UniqueID的最后一个实例。理想情况下,新数据应如下所示:
UniqueID MonthYear Count2 CCount Corrected
402ABC OCT2018 5 1 0
402ABC NOV2018 5 2 0
402ABC DEC2018 5 3 0
402ABC JAN2019 5 4 0
402ABC FEB2019 5 5 1
495DEF FEB2019 10 1 0
495DEF MAR2019 10 2 0
495DEF APR2019 10 3 0
495DEF MAY2019 10 4 0
495DEF JUN2019 10 5 0
495DEF AUG2019 10 6 0
495DEF SEP2019 10 7 0
495DEF DEC2019 10 8 0
495DEF JAN2020 10 9 0
495DEF FEB2020 10 10 1
我有一系列嵌套的ifelse函数,用于在数据框中创建“已更正”列。嵌套的块如下所示:
smd$Corrected=ifelse(smd$MonthYear=="OCT2018" & smd$Count2==1, 1,ifelse(
smd$MonthYear=="OCT2018" & smd$Count2 >1, 0,ifelse(
smd$MonthYear=="NOV2018" & smd$Count2==1, 1,ifelse(
smd$MonthYear=="NOV2018" & smd$Count2==smd$CCount, 1,ifelse(
smd$MonthYear=="NOV2018" & smd$Count2!=smd$CCount, 0,ifelse(
smd$MonthYear=="DEC2018" & smd$Count2==1, 1,ifelse(
smd$MonthYear=="DEC2018" & smd$Count2==smd$CCount, 1,ifelse(
smd$MonthYear=="DEC2018" & smd$Count2!=smd$CCount, 0,ifelse(
………………………
smd$MonthYear=="MAY2020" & smd$Count2==1, 1,ifelse(
smd$MonthYear=="MAY2020" & smd$Count2==smd$CCount, 1,ifelse(
smd$MonthYear=="MAY2020" & smd$Count2!=smd$CCount, 0,0
)))))))))))))))))))))))))))))))))))))))))))))))))))))
我知道这不是最优雅的解决方案,但是它可以达到我的目的。这只是我正在进行的较大分析的一部分。该分析每月更新一次,每次更新时,我都会在该代码中添加一个新块。今天,当我尝试更新代码时,出现以下错误:
Error: contextstack overflow at line 66
做了一些研究,我了解到当您使用太多嵌套的ifelse语句时,会弹出此错误。有关StackOverflow的其他问题建议我使用sapply或mapply重写此代码。我在这里尝试了几个应用函数来重写我的代码,但似乎没有任何工作正常。
有人可以建议我如何重写代码以不使用所有嵌套的ifelse函数吗?任何帮助将不胜感激!
谢谢!
答案 0 :(得分:1)
正如我在评论中提到的那样,我的建议是删除MonthYear
上的逐行条件,看来您并不需要这样做。
如果有必要以smd$MonthYear %in% c("OCT2018", "NOV2018" ...)
为条件,则最好使用
ifelse
在您的while(readerFile.ready()) {
String line = readerFile.readLine();
System.out.println(Integer.parseInt(line));
int number = Integer.parseInt(line);
arrayList.add(number);
}
中。