我是R的新手但是已经转向它来解决我正在尝试处理的大型数据集的问题。目前我有4列数据(Y值)设置对分钟间隔时间戳(月/日/年小时:分钟)(X值)如下:
timestamp tr tt sr st
1 9/1/01 0:00 1.018269e+02 -312.8622 -1959.393 4959.828
2 9/1/01 0:01 1.023567e+02 -313.0002 -1957.755 4958.935
3 9/1/01 0:02 1.018857e+02 -313.9406 -1956.799 4959.938
4 9/1/01 0:03 1.025463e+02 -310.9261 -1957.347 4961.095
5 9/1/01 0:04 1.010228e+02 -311.5469 -1957.786 4959.078
我遇到的问题是缺少一些时间戳值 - 例如在9/1/01 0:13和9/1/01 0:27之间可能存在差距,并且这些差距在数据集中是不规则的。我需要将这些系列中的几个放在同一个数据库中,因为每个系列的缺失值都不同,所以日期当前并不对齐每一行。
我想为这些缺失的时间戳生成行,并用空值(无数据,不为零)填充Y列,以便我有一个连续的时间序列。
老实说,我不太确定从哪里开始(在我学习之前没有真正使用过R!)但是任何帮助都会非常感激。到目前为止,我已经安装了chron和zoo,因为看起来它们可能很有用。
谢谢!
答案 0 :(得分:31)
这是一个老问题,但我只是想发布一个处理这个问题的dplyr方法,因为我在搜索类似问题的答案时遇到了这个帖子。我发现它比动物园方法更直观,更容易。
library(dplyr)
ts <- seq.POSIXt(as.POSIXct("2001-09-01 0:00",'%m/%d/%y %H:%M'), as.POSIXct("2001-09-01 0:07",'%m/%d/%y %H:%M'), by="min")
ts <- seq.POSIXt(as.POSIXlt("2001-09-01 0:00"), as.POSIXlt("2001-09-01 0:07"), by="min")
ts <- format.POSIXct(ts,'%m/%d/%y %H:%M')
df <- data.frame(timestamp=ts)
data_with_missing_times <- full_join(df,original_data)
timestamp tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05 NA NA NA NA
7 09/01/01 00:06 NA NA NA NA
8 09/01/01 00:07 NA NA NA NA
同样使用dplyr,这样可以更容易地做一些事情,例如将所有缺失值更改为其他内容,这在ggplot中绘图时对我来说很方便。
data_with_missing_times %>% group_by(timestamp) %>% mutate_each(funs(ifelse(is.na(.),0,.)))
timestamp tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05 0 0 0 0
7 09/01/01 00:06 0 0 0 0
8 09/01/01 00:07 0 0 0 0
答案 1 :(得分:23)
我认为最简单的事情就是先设置Date,如前所述,转换为zoo,然后设置合并:
df$timestamp<-as.POSIXct(df$timestamp,format="%m/%d/%y %H:%M")
df1.zoo<-zoo(df[,-1],df[,1]) #set date to Index
df2 <- merge(df1.zoo,zoo(,seq(start(df1.zoo),end(df1.zoo),by="min")), all=TRUE)
从您的df1(原始数据)中给出开始和结束,并且您正在设置 - 例如min - 根据您的示例需要。 all = TRUE将缺少日期的所有缺失值设置为NAs。
答案 2 :(得分:13)
日期填充在R中的padr
包中实施。如果存储数据框,则日期时间变量存储为POSIXct
或POSIXlt
。您所需要做的就是:
library(padr)
pad(df_name)
请参阅vignette(&#34; padr&#34;)或此博客文章,了解其工作原理。
答案 3 :(得分:2)
# some made-up data
originaldf <- data.frame(timestamp=c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:04"),
tr = rnorm(4,0,1),
tt = rnorm(4,0,1))
originaldf$minAsPOSIX <- as.POSIXct(originaldf$timestamp, format="%m/%d/%y %H:%M", tz="GMT")
# Generate vector of all minutes
ndays <- 1 # number of days to generate
minAsNumeric <- 60*60*24*243 + seq(0,60*60*24*ndays,by=60)
# convert those minutes to POSIX
minAsPOSIX <- as.POSIXct(minAsNumeric, origin="2001-01-01", tz="GMT")
# new df
newdf <- merge(data.frame(minAsPOSIX),originaldf,all.x=TRUE, by="minAsPOSIX")
答案 4 :(得分:1)
如果你想用零替换上面提到的任何方法获得的NA值,你可以这样做:
df[is.na(df)] <- 0
(我想在Ibollar的回答中发表评论,但我缺乏必要的声誉,因此我发布了答案)
答案 5 :(得分:0)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
addButton = (Button) findViewById(R.id.addButton);
listView = (ListView) findViewById(R.id.listView);
listItems = new ArrayList<String>();
listItems.add("First Item - added on Activity Create");
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, listItems);
listView.setAdapter(adapter);
addButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
listItems.add(editText.getText().toString());
adapter.notifyDataSetChanged();
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position,
long id) {
Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_LONG)
.show();
}
});
}
答案 6 :(得分:0)
我正在寻找类似的东西,而不是填写丢失的时间戳我的数据是几个月和几天。因此,我希望产生一系列能满足闰年等待的月份。我使用lubridate
:
date <- df$timestamp[1]
date_list <- c(date)
while (date < df$timestamp[nrow(df)]){
date <- date %m+% months(1)
date_list <- c(date_list,date)
}
date_list <- format(as.Date(date_list),"%Y-%m-%d")
df_1 <- data.frame(months=date_list, stringsAsFactors = F)
这将为我提供增量月份的日期列表。然后我加入
df_with_missing_months <- full_join(df_1,df)
答案 7 :(得分:0)
在R中处理时间序列数据方面有一些进展,例如tsibble
package以整洁的方式添加了以下时间序列操作:
library(tsibble)
library(lubridate)
ts <- lubridate::dmy_hm(c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:27"))
originaldf <- tsibble(timestamp = ts,
tr = rnorm(4,0,1),
tt = rnorm(4,0,1),
index = timestamp)
originaldf %>%
fill_gaps()
答案 8 :(得分:0)
我认为可以通过使用complete
软件包中的tidyr
来实现。
library(tidyverse)
df <- df %>%
complete(timestamp = seq.POSIXt(min(timestamp), max(timestamp), by = "minute"),
tr, tt, sr,st)
您还可以初始化开始日期和结束日期,而不用使用min(timestamp)
和max(timestamp)
。