私は信じている非常に単純な問題に直面しています。右にシフトする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)
}
は、このことが非常に遅いだと期待して正常に動作している(私が通過するラインの数百を持っていることがあり、それが数十を取っている:
は、私がこれまでのところ、このコードを使用した事のこのタイプを中心に取り組んできました分は理想的ではない)。私はおそらく、このタイプのことをするための最速の方法を使用したことを知っています。どのように私はそのような結果を達成するのですか?
ご協力いただきありがとうございます。コメントに基づいて
'sel < - grepl(" A "、df $ ColumnWhereAareExpected、fixed = TRUE); df [sel、 "A"] < - df [sel、 "ColumnWhereAareExpected") ' – Roland
' df $ ColumnWhereAareExpected'とは何ですか?それらの 'A'値は常に特定の列に期待されているのですか、それともどの列にも表示できますか? –
それはまさにあなたが言ったことです:出現するとき、それは常に同じ列にあります。この例では "y"なので、代わりに私の例にマッチするようにdf $ yと答えてください。 – homer3018