首页 > 解决方案 > 使用 for 循环和 ifelse 语句时,返回的列中没有值变化)

问题描述

我编写了一个函数 ( pre_post_comparision),它采用一组包含调查响应的列,并使用一个for循环和一系列ifelse语句来有条件地增加一个bonus_points名为

该函数的目标是返回bonus_points包含用户分数的列。bonus_points应该在 0 到 3 之间。

使用完整数据集运行函数时,返回的分数没有变化,每个用户的分数为 2。在同一行运行该函数时,我能够实现变量的bonus_points变化(即,bonus_points 范围在 0、1、2、3 之间)。

我应该对函数进行哪些更改才能返回正确的bonus_points分数?

为了提供帮助,下面是我的代码和数据集的示例。

提前致谢!

pre_post_comparison 函数

SEA_VALUE_LUT <- function(df){
  for (i in 1:length(df)){
    df[,i][df[i] == 4] <- 5
    df[,i][df[i] == 3] <- 4
    df[,i][df[i] == 2] <- 3
    df[,i][df[i] == 0] <- 0
  }
  return(df)
}

pre_post_comparison <- function(df, cap){  
  df$bonus_points <- 0
  for(i in seq(from=1, to=length(df)-2, by = 2)){
    x <- as.data.frame(df[,i])
    y <- as.data.frame(df[,i+1])
    is_strength <- TRUE
    pairs_df <- cbind(x, y)
    pairs_df <- SEA_VALUE_LUT(pairs_df)
    colnames(pairs_df) <- c("cur_value", "pre_value")
    attach(pairs_df)
    ifelse(cur_value >=3, 
           ifelse(is_strength && pre_value == 5,
                  df$bonus_points <- df$bonus_points + 1,
                  ifelse(!is_strength && pre_value == 0, 
                         df$bonus_points <- df$bonus_points + 1,
                         ifelse(pre_value == 2 || pre_value == 3 || pre_value == 4, 
                                df$bonus_points <- df$bonus_points + 1, NA))), NA)
    detach(pairs_df)
  }

  df$bonus_points[df$bonus_points > cap] <- cap
  return(df$bonus_points)
}

示例数据框

dput(Example.df)
structure(list(H.Response2.Attack = c(4L, 4L, 4L, 4L), H.Response.Attack = c(4L, 
4L, 4L, 4L), H.Response2.Budget = c(4L, 3L, 3L, 4L), H.Response.Budget = c(4L, 
2L, 2L, 4L), H.Response2.Cred = c(4L, 3L, 3L, 4L), H.Response.Cred = c(3L, 
4L, 4L, 4L)), class = "data.frame", row.names = c(NA, -4L))

根据 QuickReaction 的反馈更新了 pre_post_comparison 函数

pre_post_comparison <- function(sea_df, cap){  
  sea_df$bonus_points <- 0
  for(i in seq(from=1, to=length(sea_df)-2, by = 2)){
    x <- as.data.frame(sea_df[,i])
    y <- as.data.frame(sea_df[,i+1])
    is_strength <- TRUE # For now just assume 
    pairs_df <- cbind(x, y)
    pairs_df <- SEA_VALUE_LUT(pairs_df)
    colnames(pairs_df) <- c("cur_value", "pre_value")
    attach(pairs_df)
    boolean <- cur_value >=3 & ((is_strength & pre_value == 5)  | (!is_strength & pre_value == 0) | (pre_value == 2 | pre_value == 3 | pre_value == 4))
    sea_df[boolean,"bonus_points"] <- sea_df[boolean,"bonus_points"]+1
    detach(pairs_df)
  }
  print(sea_df$bonus_points)
  sea_df$bonus_points[sea_df$bonus_points > cap] <- cap
  return(sea_df$bonus_points)
}

标签: rdataframefor-loopif-statement

解决方案


推荐阅读