因此,这里的数据是什么样子:
x1 x2 x3 x4 x5 x6 x7 x8 x9
0 0 0 1 2 Complete Closed Closed Closed
0 0 0 0 0 0 0 0 Complete
0 1 2 3 Complete 1 1 1 1
我想找到一种方法,其中值“完成”发生小区后更换成一排“关闭”所有剩余值。它应该始终只是说完全封闭的价值发生之后使你可以看到,有没有关注这个逻辑是我需要更正的错误的几行。
最终的数据应该是这样的:
x1 x2 x3 x4 x5 x6 x7 x8 x9
0 0 0 1 2 Complete Closed Closed Closed
0 0 0 0 0 0 0 0 Complete
0 1 2 3 Complete Closed Closed Closed Closed
我在想一个for循环可以只运行在数据中的每一行,并检查该值是否存在“完成”,然后就改变该行以“封闭”在剩下的值,但我不知道语法将是什么喜欢。
我会写为清楚一个简单的实用功能:
close_after_complete = function(x) {
ifelse(cumsum(x == "Complete") >= 1 & x != "Complete", "Closed", x)
}
您可以阅读cumsum(x == "Complete") >= 1
为“我们已经看到了至少1‘完成’”和,当然,x != "Complete"
是“但当前值不是‘完成’”。当这两个条件都满足,要更改为“关闭”的值。
由于我们对行操作,转化为矩阵(隐含的),并使用apply
是有道理的:
t(apply(df, 1, close_after_complete))
# x1 x2 x3 x4 x5 x6 x7 x8 x9
# [1,] "0" "0" "0" "1" "2" "Complete" "Closed" "Closed" "Closed"
# [2,] "0" "0" "0" "0" "0" "0" "0" "0" "Complete"
# [3,] "0" "1" "2" "3" "Complete" "Closed" "Closed" "Closed" "Closed"
如果你愿意,你可以转换回数据帧与as.data.frame()
。
# using this data
df = read.table(header = T, stringsAsFactors = F, text = "x1 x2 x3 x4 x5 x6 x7 x8 x9
0 0 0 1 2 Complete Closed Closed Closed
0 0 0 0 0 0 0 0 Complete
0 1 2 3 Complete 1 1 1 1")