2014-07-24 58 views
0

我正在嘗試使用相同數量和名稱的列和行在兩個數據庫中處理R中的數據。一個數據庫(database1)具有'1'和' - '來指示哪些單元格值得關注。另一個數據庫(database2)只是充滿了數據。在R中快速處理很多很多行

我試圖用' - '替換數據庫2中所有'無價值的數據'(在database1中用' - '標記)。

我的代碼運行良好,但它確實很慢。在每個電子表格中有1900行和〜8000列,代碼需要運行大約4個小時以上,這是不理想的。

我怎樣才能讓這段代碼更快?任何幫助! 謝謝!

下面的代碼(原諒變量名:P):

for (n in 1:nrow(poopy)){ 
list <- 0 
gooddates <- colnames(additions[which(additions[n,] == ' 1 ' | additions[n,] == '1')]) #some cells have a '1' and others a ' 1 ', so this accounts for both. 
for (j in 1:length(gooddates)){ 
    nextdateindex <- which(gooddates[j] == colnames(additions))+1 #database1 is by month. database2 is by day, so I'm taking the intervals of gooddates. 
    if (is.na(colnames(additions)[nextdateindex])){ 
    nextdateindex <- '6.26.2014' 
    couple <- cbind(gooddates[j], nextdateindex) #start and end intervals of gooddates 
    list <- rbind(list, couple) 
    } 
    else{ 
    couple <- cbind(gooddates[j], colnames(additions)[nextdateindex]) 
    list <- rbind(list, couple) 
    } 
} 
list <- list[-1,] 

test <- poopy 

if (is.null(nrow(list))){ ##some lists will only have one interval. this changes the indexing for some reason. 
test <- test[n,-which(colnames(test) == list[1]):-(which(colnames(test) == list[2])-1)] 
} 
else{ 
for (i in 1:nrow(list)){ 
    test <- test[n,-which(colnames(test) == list[i,1]):-(which(colnames(test) == list[i,2])-1)] 
} 
} 

poopy[n,which((test == "--") == FALSE)[-1]] <- '--' 

} 

編輯:數據庫1爲一個月; DATABASE2每天,所以1和--s無法從數據庫1匹配一對一到數據庫2。我假設數據庫1中的1在整個月內保持爲1,這就是爲什麼我在'couple'變量中做了一個範圍,它將database1中的日期作爲第一個列名,nextdateindex Database1中的下一個數據點。希望澄清它!

非常接近,羅蘭。謝謝你的嘗試!

+0

您是否可以包含poopy樣本數據集?如果數據不敏感,請輸入(head(poopy,10))' – Vlo

+0

沒什麼特別。數據集1有 - 和1。數據集2有數字。不同之處在於Dataset1具有數個月的列,而dataset2具有所有日期的列,因此列數不同。 – Landmaster

回答

0

硬盤沒有輸入數據的說,但也許是這樣的:

#some artificial data 
set.seed(42) 
dat1 <- as.data.frame(matrix(rnorm(20), 5)) 
dat2 <- as.data.frame(matrix(sample(c(1, "--"),20, TRUE), 5)) 

#a one-liner 
dat1[dat2=="1"] <- NA 
dat1 
#   V1   V2   V3   V4 
# 1  NA -0.10612452   NA 0.6359504 
# 2  NA 1.51152200   NA -0.2842529 
# 3  NA -0.09465904   NA   NA 
# 4 0.6328626 2.01842371 -0.2787888   NA 
# 5  NA -0.06271410   NA 1.3201133 

注意我是如何從結果爲R使用的NA代替"--"有很多設施,以應對NA值,這些似乎在你的數據中。

0

我最終創建了一個新的空表,其中包含database2的日期和rownames,名爲additions2。然後,我選擇數據庫中的有效列1,並將先前有效的行一直複製到下一個有效行,如下所示:

additions2 <- additions2[order(additions2$Security.Name),] 

valid <- which(colnames(additions2) %in% intersect(colnames(additions2), colnames(additions))) 

additions2[,valid] <- additions 
valid <- valid[-1] 

additions3 <- additions2 
for (i in (2:length(valid)-1)){ 
    additions2[,valid[i]:(valid[i+1]-1)] <- additions[1+i] 
} 

additions22 <- additions2 

additions22[,tail(valid,1):ncol(additions22)] <- additions[ncol(additions)]