2016-12-19 4 views
1

私は信じている非常に単純な問題に直面しています。右にシフトするR

例データ:

example=data.frame(x=c(1,2,3,4,5,6,7,8), y=c(1,2,3,X,X,X,7,8), z=c(1,2,3,4,5,6,7,8)) 

次のようになります。

x y z 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 

これは理想的な場合です。私のデータは単一の列形式になっているので、私はこのようなデータフレームにフォーマットしています。時には(すべての観測ではなく)時には、常に同じ場所に来る追加の値があります(たとえば、DFに書式設定した後は常に同じ列にあります)。

それは次のようになります。「AA」の欄は、私は、追加の値(A何かを)持っていたという理由だけで、最初の場所で作成された

x y z aa 
1 X1 Y1 Z1 <NA> 
2 X2 Y2 Z2 <NA> 
3 X3 Y3 Z3 <NA> 
4 X4 A38 Y4 Z4 
5 X5 A15 Y5 Z5 
6 X6 A8 Y6 Z6 
7 X7 Y7 Z7 <NA> 
8 X8 Y8 Z8 <NA> 

:その結果

data.frame(x=c("X1","X2","X3","X4","X5","X6","X7","X8"), 
y=c("Y1","Y2","Y3","A38","A15","A8","Y7","Y8"), 
z=c("Z1","Z2","Z3","Y4","Y5","Y6","Z7","Z8"), 
aa=c(NA,NA,NA,"Z4","Z5","Z6",NA,NA)) 

元の単一列の書式付きファイル。私はその列にAの値を保存したいのです(常にAで始まる)。私は本当に "aa"を気にしません。私はこのようにすべての値をシフトしたい:

x y z aa A 
1 X1 Y1 Z1 <NA> <NA> 
2 X2 Y2 Z2 <NA> <NA> 
3 X3 Y3 Z3 <NA> <NA> 
4 X4 Y4 Z4 Z4 A38 
5 X5 Y5 Z5 Z5 A15 
6 X6 Y6 Z6 Z6 A8 
7 X7 Y7 Z7 <NA> <NA> 
8 X8 Y8 Z8 <NA> <NA> 

を私はここにいくつかの列を入れている例のために、本当のケースのシナリオは、同じくらい300などの列なので、ほとんどその量があることができその行でNAを見つける点まで左にシフトする値の値を返します。

format_A_things <- function(df, col) { 
    x <<- grep("A", df$ColumnWhereAareExpected) #selecting lines starting with an A 
    if (length(x) > 0){ 
    for (i in x){ 
     df[i,"SpecificColumnforA"] = df[i,col] 
     for (j in col:(ncol(df)-2)){ 
     if (is.na(df[i,j]) | is.na(df[i,j+1])){ 
      df[i,j] = NA 
     } else { 
      df[i,j] = df[i,j+1] 
     } 
     } 
    } 
    } 
    return(df) 
} 

は、このことが非常に遅いだと期待して正常に動作している(私が通過するラインの数百を持っていることがあり、それが数十を取っている:

は、私がこれまでのところ、このコードを使用した事のこのタイプを中心に取り組んできました分は理想的ではない)。私はおそらく、このタイプのことをするための最速の方法を使用したことを知っています。どのように私はそのような結果を達成するのですか?

ご協力いただきありがとうございます。コメントに基づいて

+0

'sel < - grepl(" A "、df $ ColumnWhereAareExpected、fixed = TRUE); df [sel、 "A"] < - df [sel、 "ColumnWhereAareExpected") ' – Roland

+0

' df $ ColumnWhereAareExpected'とは何ですか?それらの 'A'値は常に特定の列に期待されているのですか、それともどの列にも表示できますか? –

+0

それはまさにあなたが言ったことです:出現するとき、それは常に同じ列にあります。この例では "y"なので、代わりに私の例にマッチするようにdf $ yと答えてください。 – homer3018

答えて

0

は、ここで私がアクションを実行するために、私の機能を変換する方法である:

countString <- function(df, col, str) { 
    sel <<- grepl(str, df[,col], fixed = TRUE) 
    while (any(sel)){ 
    df[sel,"Column"] = df[sel,"Column"] + 1 
    df[sel, c(col:(ncol(df)-2))] <- df[sel, c(col+1:(ncol(df)-3))] 
    sel <<- grepl(str, df[,col], fixed = TRUE) 
    } 
    return(df) 
} 

私はしばらくの間で、しばらくの最後に選択をリセットし、それを介して行っだろうと期待しているだろう必要に応じていくつかの出現。そうではないので、私は私の関数を呼び出すときに、私は再び選択を使用し、any(sel)が真であれば、私はこの関数を再び呼び出します。

とにかく、ここの主な目的は以前の方法よりもはるかに高速です。

ありがとうございました。

関連する問題