R 中数据清理的可能解决方案

Possible solution for data cleaning in R

我有一个包含两个日期和时间列的数据集。我想将日期和时间列排列在同一行中,如果它们不匹配,则删除第二个日期和时间列右侧的所有内容。我的数据集问题示例如下所示。

注意Time.1!=Time。清理后的数据集最终版本应如下所示:

我想删除 Date.1 列右侧的所有内容,直到 Date.1=Date 和 Time.1=Time。

我编写了以下 R 代码来执行此操作:

rm(list = ls())
data<-read.csv(file="data.csv",header=T,stringsAsFactors=FALSE)
datacol<-ncol(data)
datarow<-nrow(data)

for (i in 1:datarow){
  for (j in 1:(datarow-1)){
    while(data$Date[i]!=data$Date.1[j] | data$Time[i]!=data$Time.1[j]){data[j,6:datacol]<-data[j+1,6:datacol]; 
    if (j<datarow) next; if (j == datarow) break; print(data[i,]);}
  }
}

然而,即使我在满足行的长度时指定了 break,R 也只是不停地保持 运行。如果有任何关于如何解决此问题的建议,我将不胜感激。

谢谢。

考虑按列进行子集化,然后在不需要嵌套 for 循环的情况下合并数据集。下面复制了填充值的数据以供演示:

df <- read.table(text="Date     Time    Price   MA        X     Date.1      Time.1    Open      High    Low     Close   BMA     Vol
                       5/2/2016 5:00    9810+   98073.07  NA    5/2/2016    5:00      130035    130040  130020  130035  130020  7014
                       5/2/2016 0:30    98080   98071     NA    5/2/2016    4:30      130030    130035  130020  130035  130017  6631
                       5/2/2016 0:00    9809+   98070.05  NA    5/2/2016    4:00      130030    130035  130020  130030  130016  2465
                       5/1/2016 23:30   9809+   98066     NA    5/2/2016    3:30      130025    130035  130020  130030  130015  2918
                       5/1/2016 23:00   9809+   98063.03  NA    5/2/2016    3:00      130030    130030  130020  130020  130012  2289
                       5/1/2016 22:30   98080   98061     NA    5/2/2016    2:30      130035    130035  130030  130030  130010  4699
                       5/3/2016 12:30   7777    7777      NA    5/2/2016    0:30      130030    130035  130010  130015  130005  4424
                       5/3/2016 12:45   8888    8888      NA    5/2/2016    0:00      130030    130035  130025  130030  130005  1906
                       5/4/2016 13:30   78787   78787     NA    5/1/2016    23:30     130020    130035  130015  130030  130002  5429
                       5/4/2016 13:45   87878   87878     NA    5/1/2016    23:00     130015    130020  130015  130020  130001  540
                       5/4/2016 13:50   77888   88777     NA    5/1/2016    22:30     130010    130020  130010  130015  130000  1417
                 ", header = TRUE)

# SUBSET INTO TWO SEPARATE DFs
df1 <- df[c('Date', 'Time', 'Price', 'MA', 'X')]
df2 <- df[c('Date.1', 'Time.1', 'Open', 'High', 'Low', 'Close', 'BMA', 'Vol')]

# MERGE BY DATE AND TIME COLUMNS 
#  (NOTE: LOSE SECOND PAIR OF JOIN VARS --Date.1, Time.1-- WITH DF SORT)
finaldf <- merge(df1, df2, by.x = c('Date', 'Time'), by.y = c('Date.1', 'Time.1'))
finaldf

#       Date  Time Price MA       X  Open   High   Low    Close  BMA    Vol
# 1 5/1/2016 22:30 98080 98061.00 NA 130010 130020 130010 130015 130000 1417
# 2 5/1/2016 23:00 9809+ 98063.03 NA 130015 130020 130015 130020 130001  540
# 3 5/1/2016 23:30 9809+ 98066.00 NA 130020 130035 130015 130030 130002 5429
# 4 5/2/2016  0:00 9809+ 98070.05 NA 130030 130035 130025 130030 130005 1906
# 5 5/2/2016  0:30 98080 98071.00 NA 130030 130035 130010 130015 130005 4424
# 6 5/2/2016  5:00 9810+ 98073.07 NA 130035 130040 130020 130035 130020 7014