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