【发布时间】:2012-11-14 21:01:55
【问题描述】:
这是一个示例数据框:
> df = data.frame(rep(seq(0, 120, length.out=6), times = 2), c(sample(1:50, 4),
+ NA, NA, NA, sample(1:50, 5)))
> colnames(df) = c("Time", "Pat1")
> df
Time Pat1
1 0 33
2 24 48
3 48 7
4 72 8
5 96 NA
6 120 NA
7 0 NA
8 24 1
9 48 6
10 72 28
11 96 31
12 120 32
必须替换的 NA 由 which 和逻辑运算符标识:
x = which(is.na(df$Pat1) & df$Time == 0)
我知道locf() 命令,但它正在替换所有 NA。如何仅替换多列 df 中位置 x 的 NA?
编辑:这是我原始数据集的链接:link
这就是我能走多远:
require(reshape2)
require(zoo)
pad.88 <- read.csv2("pad_88.csv")
colnames(pad.88) = c("Time", "Increment", "Side", 4:length(pad.88)-3)
attach(pad.88)
x = which(Time == 240 & Increment != 5)
pad.88 = pad.88[c(1:x[1], x[1]:x[2], x[2]:x[3], x[3]:x[4], x[4]:x[5], x[5]:x[6],x[6]:x[7], x[7]:x[8], x[8]:nrow(pad.88)),]
y = which(duplicated(pad.88))
pad.88$Time[y] = 0
pad.88$Increment[y] = Increment[x] + 1
z = which(is.na(pad.88[4:ncol(pad.88)] & pad.88$Time == 0), arr.ind=T)
a = na.locf(pad.88[4:ncol(pad.88)])
我的下一步是类似于pat.cols[z] = a[z],它不起作用。
结果应该是这样的:
Time Increment Side 1 2 3 4 5 ...
150 4 0 27,478 24,076 27,862 20,001 25,261
165 4 0 27,053 24,838 27,231 20,001 NA
180 4 0 27,599 24,166 27,862 20,687 NA
195 4 0 27,114 23,403 27,862 20,001 NA
210 4 0 26,993 24,076 27,189 19,716 NA
225 4 0 26,629 24,21 26,221 19,887 NA
240 4 0 26,811 26,228 26,431 20,001 NA
0 5 1 26,811 26,228 26,431 20,001 25,261
15 5 1 ....
第 5 列中的最后一个有效值为 25,261。此值替换时间 0/Col 5 处的 NA。
【问题讨论】:
-
您的问题标题与您对
x的描述不一致。您想要特定的NA值还是给定列中的最后一个NA? -
请提供一小部分链接数据,最重要的是,提供您想要的结果。
-
问题标题对简化示例有效,但问题似乎更复杂,因为在某些列中存在多个具有 NA 的段。 x 的定义是正确的。我正在更新问题标题。