R中带NA的双for循环

R中带NA的双for循环,r,for-loop,R,For Loop,我对我的R脚本有几个问题。我有一个数据库,其中有许多系列的NA和数值。我想从我们有一个数值的那一刻起,用0替换NA,但如果系列赛没有开始,则保留NA 正如我们在下面看到的,例如,在第二列中,我想保留2第一个NA,但将第四个替换为0 这是我的脚本,但不起作用 如果您能提出一些建议,我将不胜感激 非常感谢 ER如果这是您的数据集: ORIGINAL_DATA <- data.frame(X1 = c(23, NA, NA, 35), X

我对我的R脚本有几个问题。我有一个数据库,其中有许多系列的NA和数值。我想从我们有一个数值的那一刻起,用0替换NA,但如果系列赛没有开始,则保留NA

正如我们在下面看到的,例如,在第二列中,我想保留2第一个NA,但将第四个替换为0

这是我的脚本,但不起作用

如果您能提出一些建议,我将不胜感激

非常感谢


ER

如果这是您的数据集:

ORIGINAL_DATA <- data.frame(X1 = c(23, NA, NA, 35), 
                            X2 = c(NA, NA, 45, NA), 
                            X3 = c(4, 34, NA, 5))
这可能会奏效:

for(i in 1:ncol(ORIGINAL_DATA)) {
  for (j in 1:nrow(ORIGINAL_DATA)) {
    if(!is.na(ORIGINAL_DATA[j, i])) {
      ORIGINAL_DATA[c(j:nrow(ORIGINAL_DATA)), i] <- ifelse(is.na(ORIGINAL_DATA[c(j:nrow(ORIGINAL_DATA)), i]), 0, ORIGINAL_DATA[c(j:nrow(ORIGINAL_DATA)), i])

      # To end this for-loop
      j <- nrow(ORIGINAL_DATA)
    }
  }
}

如果您或任何其他人希望避免for循环:

# example dataset
df = data.frame(x1 = c(23,NA,NA,35),
                x2 = c(NA,NA,45,NA),
                x3 = c(4,34,NA,5))

# function to replace NAs not in the beginning of vector with 0
f = function(x) { x[is.na(x) & cumsum(!is.na(x)) != 0] = 0; x }

# apply function and save as dataframe
data.frame(sapply(df, f))

#   x1 x2 x3
# 1 23 NA  4
# 2  0 NA 34
# 3  0 45  0
# 4 35  0  5
或者使用tidyverse和相同的函数f:


你的脚本是一个图像。。。你能改发代码吗?相关的,可能是重复的
library(tidyverse)

df %>% map_df(f)

# # A tibble: 4 x 3
#     x1    x2    x3
#   <dbl> <dbl> <dbl>
# 1   23.   NA     4.
# 2    0.   NA    34.
# 3    0.   45.    0.
# 4   35.    0.    5.