我的示例数据框的构造如下:
ID <- c("1", "2", "1", "2", "1", "2")
Current <- c(1.12, NA, 3.66, 8.95, 4.73, 7.82)
Previous <- c(NA, NA, NA, NA, NA, NA)
df <- data.frame(ID, Current, Previous, stringsAsFactors = TRUE)
通过写入ID
向levels(df$ID)
添加额外的levels(df$ID) <- c(levels(df$ID), "3")
会导致:
> levels(df$ID)
[1] "1" "2" "3"
(我要添加一个额外的级别,因为当前正在使用的数据帧包含很多甚至一次都不会出现的级别。)
现在可以打印df
:
ID Current Previous
1 1 1.12 NA
2 2 NA NA
3 1 3.66 NA
4 2 8.95 NA
5 1 4.73 NA
6 2 7.82 NA
由于typeof(df$Current)
是"double"
,而typeof(df$Previous)
是"logical"
,我想将Previous
列转换为"double"
。为了实现这一点,我写:
df$Previous <- as.numeric(as.character(df$Previous))
现在写typeof(df$Previous)
会得到"double"
。
我现在要执行以下操作:取ID 1
的第一个Current
条目并将其复制到ID 1
的第二个Previous
条目,依此类推如果,Current
的值不是NA
。也就是说,结果表应如下所示:
ID Current Previous
1 1 1.12 NA
2 2 NA NA
3 1 3.66 1.12
4 2 8.95 NA
5 1 4.73 3.66
6 2 7.82 8.95
我已经通过编写以下for
循环来尝试执行此操作,但是它没有用,并且我不知道自己做错了什么:
i = 1
for(i in length(unique(df$ID))) {
j = 1
k = 1
idLocationAbsolute = 1
for(j in length(df$ID)) {
if(unique(df$ID)[i] == df$ID[j]) {
idLocationAbsolute[k] = j
k = k + 1
}
}
if(k > 1) {
k = k - 1
l = 1
for(l in k) {
if(!is.na(idLocationAbsolute[l])) {
df$Previous[l + 1] = df$Current[l]
}
}
}
}
请注意,我写了idLocationAbsolute = 1
,因为R否则会打印一条错误消息。但是我不能说这是一件好事,还是只是破坏了整个代码。但是,我认为这不是代码未按应做的原因。