2017-11-15 2 views
2

例データと出力式のRの文字列内:ループベクトル値

> DF 
    A B C 
1 11 22 88 
2 11 22 47 
3 2 30 21 
4 3 30 21 

> r 
[1] "A==A[i] & B==B[i] "   "A==A[i] & C==C[i] "   
[3] "B==B[i] & C==C[i] "   "A==A[i] & B==B[i] & C==C[i] " 

実行されるコード:

> output=list() 
> for (j in r){ 
+ for (i in 1:nrow(DF)){ 
+  
+  output[[j]][i]=j 
+ } 
+ } 
> output 
$`A==A[i] & B==B[i] ` 
[1] "A==A[i] & B==B[i] " "A==A[i] & B==B[i] " "A==A[i] & B==B[i] " 
[4] "A==A[i] & B==B[i] " 

$`A==A[i] & C==C[i] ` 
[1] "A==A[i] & C==C[i] " "A==A[i] & C==C[i] " "A==A[i] & C==C[i] " 
[4] "A==A[i] & C==C[i] " 

$`B==B[i] & C==C[i] ` 
[1] "B==B[i] & C==C[i] " "B==B[i] & C==C[i] " "B==B[i] & C==C[i] " 
[4] "B==B[i] & C==C[i] " 

$`A==A[i] & B==B[i] & C==C[i] ` 
[1] "A==A[i] & B==B[i] & C==C[i] " "A==A[i] & B==B[i] & C==C[i] " 
[3] "A==A[i] & B==B[i] & C==C[i] " "A==A[i] & B==B[i] & C==C[i] " 

> output=purrr::flatten_chr(output) 
> output 
[1] "A==A[i] & B==B[i] "   "A==A[i] & B==B[i] "   
[3] "A==A[i] & B==B[i] "   "A==A[i] & B==B[i] "   
[5] "A==A[i] & C==C[i] "   "A==A[i] & C==C[i] "   
[7] "A==A[i] & C==C[i] "   "A==A[i] & C==C[i] "   
[9] "B==B[i] & C==C[i] "   "B==B[i] & C==C[i] "   
[11] "B==B[i] & C==C[i] "   "B==B[i] & C==C[i] "   
[13] "A==A[i] & B==B[i] & C==C[i] " "A==A[i] & B==B[i] & C==C[i] " 
[15] "A==A[i] & B==B[i] & C==C[i] " "A==A[i] & B==B[i] & C==C[i] " 

私の目標は、特定の値[I]と同じ出力を得ることでした、B [i]とC [i]はDFから、すなわち、最終的な出力は次のようになります。

> output 
[1] "A==11 & B==22 "   "A==11 & B==22 "   
[3] "A==2 & B==30 "    "A==3 & B==30 "   
[5] "A==11 & C==88 "   "A==11 & C==47 "   
[7] "A==2 & C==21 "    "A==3 & C==21 "   
[9] "B==22 & C==88 "   "B==22 & C==47 "   
[11] "B==30 & C==21 "   "B==30 & C==21 "   
[13] "A==11 & B==22 & C==88 " "A==11 & B==22 & C==47 " 
[15] "A==2 & B==30 & C==21 " "A==3 & B==30 & C==21 " 

誰かがHELことができれば、私は感謝されますこの事でp me。

答えて

2

難しさは、ここでの問題は、rベクターで指定されている方法から来て、より良い期待される結果と一致するように、ミラノの答えを変更することは可能であろう。その代わりの

r <- c(
    "A==A[i] & B==B[i]", 
    "A==A[i] & C==C[i]", 
    "B==B[i] & C==C[i]", 
    "A==A[i] & B==B[i] & C==C[i]" 
) 

、私はrの各要素には、あなただけの列の名前を特定する必要があることを考えると、別のルートを取りますよ。たとえば、最初のケースでは、ABが必要です。そもそも名を取得するための整頓にevalを使用する関数にそれをすべてアップをラッピング

map(names, ~{ 
    glue("{name} == {values}", name = ., values = DF[[.]]) 
}) %>% 
    reduce(paste, sep = " & ") 
#> [1] "A == 11 & B == 22" "A == 11 & B == 22" "A == 2 & B == 30" 
#> [4] "A == 3 & B == 30" 

library(purrr) 
library(glue) 
library(rlang) 
names <- c("A", "B") 
DF <- data.frame(
    A = c(11, 11, 2, 3), 
    B = c(22, 22, 30, 30), 
    C = c(88, 47, 21, 21) 
) 

map(names, ~{ 
    glue("{name} == {values}", name = ., values = DF[[.]]) 
}) 
#> [[1]] 
#> A == 11 
#> A == 11 
#> A == 2 
#> A == 3 
#> 
#> [[2]] 
#> B == 22 
#> B == 22 
#> B == 30 
#> B == 30 

あなたはその後、reduceそれだけで、あなたのデータフレームの1行に1つの文字列を取得することができます。

tests <- function(data, ...){ 
    names <- map_chr(quos(...), f_name) 

    map(names, ~{ 
    glue("{name} == {values}", name = ., values = data[[.]]) 
    }) %>% 
    reduce(paste, sep = " & ") 

} 

あなたはtests 4回呼び出すことによって結果を得ることができるように:

c(
    tests(DF, A, B), 
    tests(DF, A, C), 
    tests(DF, B, C), 
    tests(DF, A, B, C) 
) 
#> [1] "A == 11 & B == 22"   "A == 11 & B == 22"   
#> [3] "A == 2 & B == 30"   "A == 3 & B == 30"   
#> [5] "A == 11 & C == 88"   "A == 11 & C == 47"   
#> [7] "A == 2 & C == 21"   "A == 3 & C == 21"   
#> [9] "B == 22 & C == 88"   "B == 22 & C == 47"   
#> [11] "B == 30 & C == 21"   "B == 30 & C == 21"   
#> [13] "A == 11 & B == 22 & C == 88" "A == 11 & B == 22 & C == 47" 
#> [15] "A == 2 & B == 30 & C == 21" "A == 3 & B == 30 & C == 21" 
+0

ありがとう、ロメイン。コードを実行しましたが、 "as_function(.f、...)でエラーが発生しました:オブジェクト 'f_name'が見つかりません"。私は何か間違ったことをしたと思います。私にこれを解決する方法を教えてください。 – Citizen

+0

おそらく、 'rlang'もロードしているはずです。今すぐ 'library(rlang)'を追加しました。 –

+1

ありがとう、Romain。それはとてもうまくいく。さて、私は、任意の数の列、すなわち大きなデータフレームの入力に対してこれを行うことについて考える必要がありますが、これはもう一つの潜在的な問題です。私はあなたの答えを最良の正解として選んだ。私が他の何かをしなければならないかどうか私に教えてください。 – Citizen

0

この出力は後で表示されますか?

DF <- data.frame(A = c(11, 11, 2, 3), 
       B = c(22, 22, 30, 30), 
       C = c(88, 47, 21, 21)) 

r <- c("A==A[i] & B==B[i]", "A==A[i] & C==C[i]", 
     "B==B[i] & C==C[i]", "A==A[i] & B==B[i] & C==C[i]") 

output=list() 
for (j in r){ 
    for (i in 1:nrow(DF)) 
    output[[j]][[i]] <- DF[with(DF, eval(parse(text = j))), ] 
} 

output 

$`A==A[i] & B==B[i]` 
$`A==A[i] & B==B[i]`[[1]] 
    A B C 
1 11 22 88 
2 11 22 47 

$`A==A[i] & B==B[i]`[[2]] 
    A B C 
1 11 22 88 
2 11 22 47 

$`A==A[i] & B==B[i]`[[3]] 
    A B C 
3 2 30 21 

$`A==A[i] & B==B[i]`[[4]] 
    A B C 
4 3 30 21 


$`A==A[i] & C==C[i]` 
$`A==A[i] & C==C[i]`[[1]] 
    A B C 
1 11 22 88 
... 
+1

おそらく危険な 'gsub'を避けるために式を' with(DF) 'で囲みます。 'DF、eval(parse(text = j)))、]' –

+0

良い提案です。私はコードを編集しました。 –

+0

ありがとうございます。私の質問は正しい方法で尋ねられなかったので、私はそれをよりよく説明したと思います。 – Citizen