if语句中的if语句只在​​R

时间:2016-08-29 16:53:54

标签: r if-statement for-loop

我有一个包含以下文本的数据框:

df$Position 

[1] "START"  "MIDDLE" "MIDDLE" "START"  "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "START"  "START"  "START"  "MIDDLE" "MIDDLE" "MIDDLE" "START" 

[22]“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE “”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“ [43]“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”

我想用“END”替换上一个“START”文本之前的“MIDDLE”文本,以标记正确的位置。

所以我基本上遍历框架中的位置,如果满足条件,则替换文本。

for(i in 2:i)
{    
# iterate through the frame
if (df$Position[i]=="START" && df$Position[i-1]=="MIDDLE")

{
df$Position[i-1] <- "END"
}
}

这似乎仅适用一次。我最终得到以下输出:

[1] "START"  "MIDDLE" "END"    "START"  "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "START"  "START"  "START"  "MIDDLE" "MIDDLE" "MIDDLE" "START" 

[22]“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“START”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE “”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“”MIDDLE“ [43]“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”“MIDDLE”

我想知道我在这里做错了什么,是否有更好的方法(可能是自定义函数??)来完成这项任务。

此致 乔纳森

2 个答案:

答案 0 :(得分:1)

这个问题可能会给大多数SO用户带来一些刺痛,因为要钉它(没有双关语)需要在R中进行一些聪明的索引操作。

您可以通过识别在 MIDDLE发生之前位置发生START时解决问题,您应该将该值替换为END。因此,您可以找到所有出现的MIDDLE,然后将其与包含所有出现的START向量偏移一的向量相匹配。

x <- position == "MIDDLE"
y <- c((position == "START")[2:length(position)], FALSE)
position[x & y] <- "END"

> position
 [1] "START"  "MIDDLE" "END"    "START"  "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE"
 [9] "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "MIDDLE" "END"    "START"  "START" 
[17] "START"  "MIDDLE" "MIDDLE" "END"    "START"  "START"  "MIDDLE" "MIDDLE"
[25] "MIDDLE"

数据:

position <- c("START", "MIDDLE", "MIDDLE", "START", "MIDDLE", "MIDDLE", "MIDDLE",
              "MIDDLE", "MIDDLE", "MIDDLE" ,"MIDDLE", "MIDDLE", "MIDDLE", "MIDDLE",
              "START", "START", "START" , "MIDDLE", "MIDDLE", "MIDDLE", "START",
              "START", "MIDDLE", "MIDDLE", "MIDDLE")

答案 1 :(得分:0)

尝试使用for (i in 2:length(df$Position))代替for(i in 2:i)