有条件地修改数据框列值

时间:2019-10-12 16:09:52

标签: r dataframe if-statement dplyr

我有一个数据框,该框显示了状态测试中与不同性能级别(1到5)相关的得分。 DF看起来像这样:

grade <- rep(1:2, each = 5)
performance_level <- rep(1:5, 2)
score_start <- c(100, 134, 157, 170, 192, 100, 129, 142, 158, 180)
score_end <- c(134, 156, 169, 192, 220, 128, 142, 157, 179, 200)

df <- data.frame(grade, performance_level, score_start, score_end)

问题是,某些行中的score_end与下一行(例如第1行和第2行)中的score_start相同,因此,得分为134的一年级学生将被复制并显示为同时获得plevel 1和plevel2。我想在第2行的分数开始加1,所以是135。显然,这个问题出现在多行中(我有一个大数据集)。我已经尝试过使用dplyr超前和滞后,但是我无法完全按照我想要的方式运行它。这是到目前为止我尝试过的代码:

尝试#1

df$score_start[which(df$score_start == lag(df$score_end)] <- df$score_start + 1

尝试#2

df <- df %>% mutate(score_start = ifelse(score_end == lead(score_start), score_start + 1, score_start))

我会很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

也许您是这样做的:

df <- data.table(df)
df[,score_end2:=shift(score_end,1),by=.(grade)]
df[,score_start:=ifelse(is.na(score_end2),score_start,ifelse(score_start==score_end2,score_start+1,score_start))]
df[,score_end2:=NULL]

答案 1 :(得分:1)

请查看逻辑。

for(i in 1:(nrow(df)-1)) {
  if(df$score_end[i] == df$score_start[i+1]) {
    df$score_start[i+1] = df$score_start[i+1]+1
  }
}