我有一个数据框,第一列从1到365就像这样
c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2...
并且第二列有时间像这样一遍又一遍地重复
c(0,30,130,200,230,300,330,400,430,500,0,30,130,200,230,300,330,400,430,500...
所以对于第一列中的每1个值,我在第二列中有相应的时间,那么当我到达2时,时间重新开始,每个2都有相应的时间,
偶尔我会遇到c(3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4...
c(0,30,130,200,230,330,400,430,500,0,30,130,200,230,300,330,400,430,500...
这里缺少3个中的一个,缺少相应的300个时间。
如何浏览整个数据框并添加这些缺失值?我需要一种方法让R通过并识别任何缺失的值,然后插入一行并在第一列中放入适当的值1到365以及适当的时间。因此,对于给定的示例,R将在230和330之间添加一行,然后在第一列中放置3,在第二列中放置300。该列的某些部分缺少多个连续值。它不只是一个人在那里
答案 0 :(得分:5)
编辑:解决方案,所有10次事先明确指定并编码整理/评论
您需要创建包含每个可能行的另一个data.frame
,然后使用merge
创建data.frame
。关键方面是最终合并中的all.x = TRUE
,它会强制突出显示数据中的空白。我通过在your.dat
# create vectors for the days and times
the.days = 1:365
the.times = c(0,30,100,130,200,230,330,400,430,500) # the 10 times to repeat
# create a master data.frame with all the times repeated for each day, taking only the first 20 observations
dat.all = data.frame(x1=rep(the.days, each=10), x2 = rep(the.times,times = 365))[1:20,]
# mimic your data.frame with some gaps in it (only 15 of 20 observations are present)
your.sample = sample(1:20, 15)
your.dat = data.frame(x1=rep(the.days, each=10), x2 = rep(the.times,times = 365), x3 = rnorm(365*10))[your.sample,]
# left outer join merge to include ALL of the master set and all of your matching subset, filling blanks with NA
merge(dat.all, your.dat, all.x = TRUE)
以下是合并的输出,显示所有20条可能的记录,其间隙清晰可见NA
:
x1 x2 x3
1 1 0 NA
2 1 30 1.23128294
3 1 100 0.95806838
4 1 130 2.27075361
5 1 200 0.45347199
6 1 230 -1.61945983
7 1 330 NA
8 1 400 -0.98702883
9 1 430 NA
10 1 500 0.09342522
11 2 0 0.44340164
12 2 30 0.61114408
13 2 100 0.94592127
14 2 130 0.48916825
15 2 200 0.48850478
16 2 230 NA
17 2 330 0.52789171
18 2 400 -0.16939587
19 2 430 0.20961745
20 2 500 NA
答案 1 :(得分:2)
以下是一些可以帮助您入门的NA处理功能。 对于插入任务,您应该使用dput或可重现的示例提供自己的数据。
df <- data.frame(x = sample(c(1, 2, 3, 4), 100, replace = T),
y = sample(c(0,30,130,200,230,300,330,400,430,500), 100, replace = T))
nas <- sample(NA, 20, replace = T)
df[1:20, 1] <- nas
df$y <- ifelse(df$y == 0, NA, df$y)
# Columns x and y have NA's in diferent places.
# Logical test for NA
is.na(df)
# Keep not NA cases of one colum
df[!is.na(df$x),]
df[!is.na(df$y),]
# Returns complete cases on both rows
df[complete.cases(df),]
# Gives the cases that are incomplete.
df[!complete.cases(df),]
# Returns the cases without NAs
na.omit(df)