2016-07-25 10 views
4

Aには、次の構造を持つリストがあります。リスト内の値を置換(コード化)

mylist=list(y~ A, 
y ~ A+B, 
y ~ A+B+C) 

私は“z”と交換(再コーディング)“y “したいです。リストに(recodeの)値を交換する方法:私の目標は、

mylist=list(z~ A, 
z ~ A+B, 
z ~ A+B+C) 

Qのですか?

私はこれを試してみました:

for i in range(len(mylist)): 
    mylist[i] = mylist[i].replace('y','z') 

は、あなたが開始と式のリストを持っているので、あなたが交換を行うためにgsubを使用し、文字に数式を変換することができます

+3

これはrコードのようには見えません。おそらく、Pythonにタグを付けることを意味しましたか? –

+0

@docendo discimus、....ああ、それは意味をなさない。私はRコードとして販売されているウェブサイトからその例を得ました。それは私の裁判の混乱を説明するものです。私はRの解決策を探していた – Adam

+0

私は答えを確認しようとしてください。 AdvancedRの素晴らしいテキストで、リスト内の要素を理解しています。リストxが列車オブジェクトである場合、x [[5]]は車内のオブジェクトです 5; x [4:6]は、車の列車4-6です。 " –

答えて

13

を使用せず、別途fromulaの異なる条件で操作することができます。

保持する数式側を示すには、.を含めます。だから、あなたの問題のために、以下は素早い1ライナーです。ただ、表現のような

lapply(mylist, update, new = z~.)

+2

これは最善の選択肢のようです。私は 'update'が' update.formula'メソッドを持っているのを知らなかった。 –

+0

@ NJBurgo、ありがとう。それはきれいで「シンプル」で、 – Adam

2

が動作していないとそれを数式に戻します。 yの交換が常に上に発生するように、@デビッドArenburgの懸念の世話をするために

lapply(mylist, function(f) formula(gsub("y", "z", format(f)), env = .GlobalEnv)) 
# [[1]] 
# z ~ A 

# [[2]] 
# z ~ A + B 

# [[3]] 
# z ~ A + B + C 

:彼らは元のリストと同じであることを確認するために式の環境を指定するenvパラメータを使用します式の左側には、より限定された正規表現を使用することができます。

lapply(mylist, function(f) formula(gsub("y(\\s)?(?=~)", "z", format(f), perl = T), env = .GlobalEnv)) 

# [[1]] 
# z ~ A 

# [[2]] 
# z ~ A + B 

# [[3]] 
# z ~ A + B + C 
+0

@ Psidom、これは私を再び笑顔にさせます。ありがとう。私はちょっと質問があります。 "env = .GlobalEnv"?それは私が理解するのに役立ちます。ありがとう – Adam

+1

私は十分安全だとは思わない。 'y〜city + country'のような公式ではどうなりますか?あるいは、レスポンス変数で異なる名前をどのように扱いますか?この正規表現は応答変数だけを対象としていません。 –

+0

@DavidArenburg私はケースがOPの記述に非常に限定されていると仮定しています。しかし、私は懸念がここで有効であると考えています。 – Psidom

6

代わりに、Rを組み込んだ式の操作機能を使用することをお勧めします。これは、私たちはupdate関数は式のために有用である正規表現

lapply(mylist, function(x) reformulate(as.character(terms(x))[3], "z")) 
# [[1]] 
# z ~ A 
# <environment: 0x59c6040> 
# 
# [[2]] 
# z ~ A + B 
# <environment: 0x59c0308> 
# 
# [[3]] 
# z ~ A + B + C 
# <environment: 0x59bb7b8> 
2

、式が交換可能な部品を持っています。だから、[[<-を使って数式の部分を置き換えることができます。 yの値は式リストの2番目の値です.~は関数なので、最初の式です。

lapply(mylist, "[[<-", 2, as.name("z")) 
# [[1]] 
# z ~ A 
# 
# [[2]] 
# z ~ A + B 
# 
# [[3]] 
# z ~ A + B + C 
関連する問題