【发布时间】:2022-01-06 10:46:05
【问题描述】:
要根据考虑另一列的条件填充数据框的空列,我找到了以下解决方案,它工作正常,但有点难看。有人知道解决这个问题的更优雅的方法吗?
base::set.seed(123)
test_df <- base::data.frame(vec1 = base::sample(base::seq(1, 100, 1), 50), vec2 = base::seq(1, 50, 1), vec3 = NA)
for (a in 1:base::nrow(test_df)){
spc_test_df <- test_df[a, ]
# select the specific row of the dataframe
if(spc_test_df$vec1 <= 25 | spc_test_df$vec1 >= 75){
# evaluate whether the deviation is below/above the threshold
spc_test_df$vec3 <- 1
# if so, write TRUE
} else {
spc_test_df$vec3 <- 0
# if not so, write FALSE
}
test_df[a, ] <- spc_test_df
# write the specific row back to the dataframe
}
【问题讨论】:
-
您的情况有点奇怪:
spc_test_df$vec1 <= 25 | spc_test_df$vec1 >= 25基本上选择了所有情况;因此一切都设置为1。 -
(1) 你的计算应该是矢量化的,不要使用
for循环。 (2) 不要在if条件句中使用|,除非它被总结(例如,any、all),而是使用||(理由包括短路)。 (3) 同上对ifelse的引用,可能类似于test_df$vec3 <- ifelse(test_df$vec1 <= 25, 1, 0),或者,因为是/否值是1 和0,最好是test_df$vec3 <- +(test_df$vec1 <= 25)(以及你对逻辑下半场的真正含义,. <= 25 | . >= 25肯定令人困惑)。 -
对不起,我编辑了这个问题。非常感谢您到目前为止的回答:)
标签: r dataframe for-loop dplyr