如果特定值的行存在,更改所有剩余价值的行新价值

问题描述 投票:0回答: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 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循环可以只运行在数据中的每一行,并检查该值是否存在“完成”,然后就改变该行以“封闭”在剩下的值,但我不知道语法将是什么喜欢。

r for-loop tidyr
1个回答
0
投票

我会写为清楚一个简单的实用功能:

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")
© www.soinside.com 2019 - 2024. All rights reserved.