计算data.frame上的字符位置

时间:2018-12-07 19:17:51

标签: r

如何根据特定字符的位置连续更改值?

我想按行将行之前S之前的所有NA值替换为0。在此特定字符S之后,必须保留该行上的NA。

S是按行结束数据的标记。

在S之前:NA应该是值(实际上是零值!!)。

在S之后:NA仍然为NA,根本没有值。

此处dataframe.txt提供了数据帧示例

我已经尝试过此循环

for (i in 1:length(df)) {
    x <- pos = 's' ; y <- pos = i if (y < x) { if (y == "NA"){ replace(y,0) } } 
}

也许可以使用which函数...

感谢您对此的想法! 亚历克斯,

1 个答案:

答案 0 :(得分:0)

此代码会将向量中“ S”之前的所有NA替换为0:

initial_row <- c(1,2,4,NA,4,NA,2,"S",NA,NA,NA)

result_row <- initial_row
result_row[is.na(result_row[1:which(result_row == "S")[1]])] <- 0

说明:首先,我们将初始行复制到将要进行处理的结果行中。然后,我们在结果行中选择位置1与“ S”的位置之间的NA。这些值将替换为零。

重要假设:

  1. 向量的长度至少为2。
  2. 向量包含一个“ S”

循环版本

如果您坚持使用循环来执行此操作(运行速度会变慢),则可以执行以下操作:

for(i in 1:length(result_row)){
  if(result_row[i] == "S"){
    break
  }
  if(is.na(result_row[i])){
    result_row[i] <- 0
  }
}

编辑:如果向量中有字符"NA"而不是NA(R识别为丢失的元素),则此代码需要进行如下修改:

result_row[(result_row[1:which(result_row == "S")[1]]) == "NA"] <- 0

for(i in 1:length(result_row)){
  if(result_row[i] == "S"){
    break
  }
  if(result_row[i] == "NA"){
    result_row[i] <- 0
  }
}