我是R.的新手。我希望在数据中替换X的缺失值。当“时间”= 1或2时,如果“时间”= 3,对于相同的“子ID”和相同的“日”,如何将“X”的缺失值替换为“X”的缺失值
子ID:主题编号
日:每个科目的日期编号(1,2,3 ... 21)
时间:早上标记为1,下午标记为2,晚上标记为3
X:当Time为3时,只有一个有效值,其他则缺失。
SubID Day Time X
1 1 1 NA
1 1 2 NA
1 1 3 7.4
1 2 1 NA
1 2 3 6.2
2 1 1 NA
2 1 2 NA
2 1 3 7.1
2 2 3 5.9
2 2 2 NA
2 2 1 NA
我能够在动物园里找到以下代码。我在R的经验非常有限。提前谢谢!
data2 <- transform(data1,
x = na.aggregate(x,by=SubID,FUN=sum,na.rm = T))
这是我的评论的解释:
library(data.table)
library(zoo)
setDT(data1)
data1[order(-Time),
Xf := na.locf(X),
by = .(SubID, Day)]
好吧,所以setDT
函数使data1
对象成为data.table
。然后order(-Time)
按data1
降序排列Time
(因为-
)。 Xf := na.locf(X)
通过引用创建一个新的列Xf
(这意味着你不必将其分配回data1
)作为na.locf(X)
,它是zoo
包中的函数,用前一个值填充NAs(在这种情况下填充2和1)具有3)中的值。最后一行指定我们要按SubID
和Day
分组。
希望现在更清楚,随时问你是否还有疑问。
您可以按降序时间对数据进行排序,然后使用X[1]
。
library(dplyr)
df <- tibble(SubID=1, Day=1, Time=c(1,2,3), X=c(NA, NA, 2.2))
df <- df %>%
group_by(SubID, Day) %>%
arrange(desc(Time)) %>%
mutate(
X=case_when(
is.na(X) ~ X[1],
TRUE ~ X)
)