R 检测数据帧中缺少的(不存在的)行,并用NA替换它们
我有一个大约12000个观测值的数据框,有两列“代码”和“日期”。每个代码应该有4个观察值,因此有4个日期,但我在“Date”列中缺少了值(不是NA,而是不存在的行) 下面是我的数据帧示例:R 检测数据帧中缺少的(不存在的)行,并用NA替换它们,r,na,missing-data,R,Na,Missing Data,我有一个大约12000个观测值的数据框,有两列“代码”和“日期”。每个代码应该有4个观察值,因此有4个日期,但我在“Date”列中缺少了值(不是NA,而是不存在的行) 下面是我的数据帧示例: Station Date 7002 17/12/1966 7002 05/05/1968 7002 30/10/1968 7002 16/08/1970 7003 02/12/1966 7003 05/05/1968 700
Station Date
7002 17/12/1966
7002 05/05/1968
7002 30/10/1968
7002 16/08/1970
7003 02/12/1966
7003 05/05/1968
7003 31/10/1968
8004 04/07/1968
8004 15/11/1968
8006 13/10/1966
8006 23/09/1967
8006 01/09/1968
[……]
我需要做的是为每个代码检测缺少的行。
我使用的是“水年”,从10月1日开始,到下一个9月30日结束,例如1998年10月1日至1999年9月30日。这是一件困难的事情,这使得我的问题不同于其他类似的问题
所考虑的时间段为1966年10月1日至1970年9月30日(4个水年),且“日期”栏中的观测值已固定为水年(即每个水年一次观测值)
我的输出应该是:
e、 g
设置样本数据:
dat = read.table(text="Station Date Day
7002 17/12/1966 77
7002 05/05/1968 582
7002 30/10/1968 760
7002 16/08/1970 1415
7003 02/12/1966 62
7003 05/05/1968 582
7003 31/10/1968 761
8004 04/07/1968 4294
8004 15/11/1968 4428
8006 13/10/1966 5856
8006 23/09/1967 6567
8006 01/09/1968 6910", header=TRUE, stringsAsFactors=FALSE)
dat$Date = as.Date(dat$Date, format=c("%d/%m/%Y"))
添加水年:我假设水年是以水年开始的年份命名的。例如,1967年10月1日至1968年9月30日的水年为1967年
dat$water.year = ifelse(month(dat$Date) %in% 1:9, year(dat$Date) - 1, year(dat$Date))
为缺少的年份添加行:我通过合并一个新的数据框来实现这一点,该数据框包括站点
和水年
的所有组合
full_join(expand.grid(Station=unique(dat$Station), water.year=1966:1969),
dat,
by=c("Station","water.year")) %>% arrange(Station, water.year)
Station water.year日期日期
1 7002 1966 1966-12-17 77
2 7002 1967 1968-05-05 582
3 7002 1968 1968-10-30 760
4 7002 1969 1970-08-16 1415
5 7003 1966 1966-12-02 62
6 7003 1967 1968-05-05 582
7 7003 1968 1968-10-31 761
870031969北美
980041966NA
10 8004 1967 1968-07-04 4294
11 8004 1968 1968-11-15 4428
1280041969NA
13 8006 1966 1966-10-13 5856
14 8006 1966 1967-09-23 6567
15 8006 1967 1968-09-01 6910
1680061968NA
1780061969NA
你说你有“12000个观察,三列”代码和“日期”“-这里只有两列。抱歉,刚刚修复。对于8006号站,您在同一个水年有两次观测。eipi10走了很远,提供了一个极好的解决方案。我唯一的建议是快速了解哪些站点缺少数据,您可以运行
table(unlist(dat$ID))[table(unlist(dat$ID))<4]
-这将让您知道哪些站点少于4个条目,然后只需为这些特定站点运行rbind()
NA行即可。您好,非常感谢!但“水年”一栏向前移动了一年。e、 g.7002 1966-12-17是1966年(不是1967年)的水年,等等。。。我怎样才能解决这个问题?我试图删除+1,但数据帧将混乱。谢谢更新的代码。两个变化:一,修正水年计算。第二,在展开.grid
中将1967:1970更改为1966:1969。
dat$water.year = ifelse(month(dat$Date) %in% 1:9, year(dat$Date) - 1, year(dat$Date))
full_join(expand.grid(Station=unique(dat$Station), water.year=1966:1969),
dat,
by=c("Station","water.year")) %>% arrange(Station, water.year)
Station water.year Date Day
1 7002 1966 1966-12-17 77
2 7002 1967 1968-05-05 582
3 7002 1968 1968-10-30 760
4 7002 1969 1970-08-16 1415
5 7003 1966 1966-12-02 62
6 7003 1967 1968-05-05 582
7 7003 1968 1968-10-31 761
8 7003 1969 <NA> NA
9 8004 1966 <NA> NA
10 8004 1967 1968-07-04 4294
11 8004 1968 1968-11-15 4428
12 8004 1969 <NA> NA
13 8006 1966 1966-10-13 5856
14 8006 1966 1967-09-23 6567
15 8006 1967 1968-09-01 6910
16 8006 1968 <NA> NA
17 8006 1969 <NA> NA