R中带NA的双for循环
我对我的R脚本有几个问题。我有一个数据库,其中有许多系列的NA和数值。我想从我们有一个数值的那一刻起,用0替换NA,但如果系列赛没有开始,则保留NA 正如我们在下面看到的,例如,在第二列中,我想保留2第一个NA,但将第四个替换为0 这是我的脚本,但不起作用 如果您能提出一些建议,我将不胜感激 非常感谢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
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.