Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 检测数据帧中缺少的(不存在的)行,并用NA替换它们_R_Na_Missing Data - Fatal编程技术网

R 检测数据帧中缺少的(不存在的)行,并用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

我有一个大约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  
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