2017-08-12 8 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」の値以上keypin2値を持つkeypin2フィールドに「0」の値を移入することである

- 条件に、そのピン値一致。

私は、単一のデータフレームにこれを実現行うためのループのための簡単なを書いた:私は2で始まる

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] 
    } 
    } 
} 

:nrow(TEST3)私はそうでない場合は最初のレコードに負のインデックスを取得するため、およびI最初のレコードが "0"のkeypin2を持っているなら、keypin2がないので "0"のままにすることができます。

結果は完璧です:

  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

一つの方法は、tidyrパッケージからfill機能を使用することです:

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を前提としてい[ピン[n]!=ピン[n-1])のとき[n]はゼロではない

関連する問題