2017-08-12 32 views
0

在過去的幾天裏,我一直試圖在遍歷數據幀列表時使用索引來填充每個數據幀中的相同字段。但我一直無法提出解決方案。我很確定我應該使用lapply,但是我不知道如何引用數據幀列表中的行號來執行命令。R:在遍歷數據幀列表時使用索引

我的數據是這樣的:

  pin  keypin2 
01011030030000 01011030030000 
01011030030000    0 
01011030040000 01011030030000 
01011030040000    0 
01011040040000 01011040030000 
01011040040000 01011040030000 
01011040040000 01011040030000 
01011040040000    0 
01011060040000 01011060010000 
01011060040000    0 
01011060040000    0 
01011060040000    0 

目的是填充「0」值與正上方的「0」值keypin2值keypin2場 - 條件是該引腳值比賽。

我寫了一個簡單的循環來完成這個單一數據幀上:

for(i in 2:nrow(test3)) { 
    if(test3[i,2] == "0") { 
    if(test3[i,1]==test3[c(i-1),1]){ 
     test3[i,2] <- test3[c(i-1),2] 
    } 
    } 
} 

我開始以2:nrow(TEST3),因爲我得到的第一條記錄負指數,否則,我知道如果第一條記錄的keypin2爲「0」,那麼我可以將它保留爲「0」,因爲沒有keypin2。

結果是完美的:

  pin  keypin2 
01011030030000 01011030030000 
01011030030000 01011030030000 
01011030040000 01011030030000 
01011030040000 01011030030000 
01011040040000 01011040030000 
01011040040000 01011040030000 
01011040040000 01011040030000 
01011040040000 01011040030000 
01011060040000 01011060010000 
01011060040000 01011060010000 
01011060040000 01011060010000 
01011060040000 01011060010000 

我現在想這個應用到數據幀的列表,都具有相同的結構。我相信我應該可以用樂隊來做到這一點,但我似乎無法做到。任何幫助或方向將不勝感激。

回答

0

只需編寫一個嵌入代碼的函數,並將lapply用於列表。在不使用循環執行此的

# reproduce data, create list 
test3 <- data.frame(
    pin = as.character(
    c(01011030030000,01011030030000,01011030040000,01011030040000,01011040040000, 
     01011040040000,01011040040000,01011040040000,01011060040000,01011060040000, 
     01011060040000,01011060040000)), 
    keypin= as.character(
    c(01011030030000,0,01011030030000,0,01011040030000,01011040030000, 
     01011040030000,0,01011060010000,0,0,0)), 
    stringsAsFactors = F 
)   
my.data <- list(test3, test3) 



# define custom function (includes your code) 
    process.df <- function(df) { 
     test3 <- df 
     for(i in 2:nrow(test3)) { 
     if(test3[i,2] == "0") { 
      if(test3[i,1]==test3[c(i-1),1]){ 
      test3[i,2] <- test3[c(i-1),2] 
      } 
     } 
     } 
     return(test3) 
    } 

# execute 
    lapply(my.data, process.df) 
0

一種方法是使用fill函數從tidyr包:

df<-read.table(header=TRUE, text="pin  keypin2 
01011030030000 01011030030000 
       01011030030000    0 
       01011030040000 01011030030000 
       01011030040000    0 
       01011040040000 01011040030000 
       01011040040000 01011040030000 
       01011040040000 01011040030000 
       01011040040000    0 
       01011060040000 01011060010000 
       01011060040000    0 
       01011060040000    0 
       01011060040000    0", colClasses=c("character", "character")) 

#replace the O with NA 
df$keypin2[df$keypin2==0]<-NA 

library(tidyr) 
#replace the NA with the cell above 
fill(df, keypin2, .direction = "down") 

這比使用一個循環更快,但它假定keypin2 (pin [n]!= pin [n-1])時[n]不爲零)