我有一个包含以下文本的数据框:
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”
我想知道我在这里做错了什么,是否有更好的方法(可能是自定义函数??)来完成这项任务。
此致 乔纳森
答案 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)
。