r - 使用 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)
}
解决方案
推荐阅读
- java - 添加新库时清单合并失败
- javascript - 将垂直滚动条添加到具有固定头的 tbody 以进行垂直滚动
- bitcoin - 比特币与比特币核心 api 集成,无需任何第三方 api
- html - XSLT 转换考虑不具有节点值的子节点
- layout - 带有缩放图像的 GridLayout 具有巨大的行间距
- javascript - 限制为一个小数点并将所有整数分数更新为“.0”,但分数为 10 和 0 除外
- cassandra - 使用列表创建用户类型
在卡桑德拉 - php - 如何获取以前交易的物品 paypal omnipay
- javascript - 在使用 jasmine 记者时,我得到“未找到规范”
- javascript - 在表格的每一行中选择第四个 td 并转换数据