2016-09-29 6 views
0

私は、Excelファイルからユーザー提供のグループ名を読み取るバイオインフォマティクスの光沢のあるアプリを作っています。これらの名前は非定型的に有効な名前である可能性があるため、内部的に有効な名前として表現したいと思います。レベルを保持しながらRの要素から構文的に有効な名前を作成する

例として、私はこの入力持つことができます。理想的には

(grps <- as.factor(c("T=0","T=0","T=4-","T=4+","T=4+"))) 
[1] T=0 T=0 T=4- T=4+ T=4+ 
Levels: T=0 T=4- T=4+ 

を、私は有効な名前を作るためにRをしたいと思いますが、同じグループ/レベルを維持し、例えば以下の罰金のようになります。 "T.0" "T.0" "T.4minus" "T.4plus" "T.4plus"

ただし、make.names()を使用すると、無効な文字はすべて同じcharaterに変換されます。

(grps2 <- as.factor(make.names(grps))) 
[1] T.0 T.0 T.4. T.4. T.4. 
Levels: T.0 T.4. 

したがって、T = 4-とT = 4 +の両方に同じ名前が与えられ、レベルが失われます(後続の分析で問題を引き起こします)。また、ユニークな設定= TRUEが問題を解決しない、

(grps3 <- as.factor(make.names(grps,unique=TRUE))) 
[1] T.0 T.0.1 T.4. T.4..1 T.4..2 
Levels: T.0 T.0.1 T.4. T.4..1 T.4..2 

グループ理由はT = 4 +は、2つの異なるグループに分割され、レベルが獲得されます。

誰もが、同じレベルを維持しながら、有効な名前に要素を組み込むことが一般的には可能な方法を知っていますか? ユーザーの入力は大きく異なる可能性があるので、ここで手動で「 - 」を「マイナス」に置き換えても機能しません。

ご協力いただきありがとうございます。あなたが行うことができますplyrからmapvalues機能付き

+0

'make.unique'関数は、' make.names'の後にこれを解決するために適用できます。 – JDL

+3

これらのラベルが構文上無効であると思われる理由を明確にしてください。追求している構文は、オブジェクトの名前として使用する場合にのみ必要です。 – Benjamin

+0

@ JDL、私が正しいなら、一度make.namesが適用されると、グループは失われてしまいます。ユニークな仕事はもうありません。 – MartijnVanAttekum

答えて

2

require("plyr") 
mapvalues(grps, levels(grps), make.names(levels(grps), unique=TRUE)) 

これはレベルの代わりの要因に直接働くので、値の数は同じままです。

1

ファクタのレベルに関連付けられたラベルは、オブジェクト名と同じ期待に合う必要はありません。次の例では、mtcarsデータ・セットのgear列の名前を変更し、それを要素にして、例で示したのと同じレベルを与えます。

library(magrittr) 
library(dplyr) 
library(broom) 
D <- mtcars[c("mpg", "gear")] %>% 
    setNames(c("y", "grps")) %>% 
    mutate(grps = factor(grps, 3:5, c("T=0", "T=4-", "T=4+"))) 

私は、線形モデルをフィット概要を取得し、レベル名は-=を持って、そしてその中の+シンボル全てながら、データフレームにそれを強制することはできています注意してください。

fit <- lm(y ~ grps, data = D) 

fit 
Call: 
lm(formula = y ~ grps, data = D) 

Coefficients: 
(Intercept)  grpsT=4-  grpsT=4+ 
    16.107  8.427  5.273 


summary(fit) 

Call: 
lm(formula = y ~ grps, data = D) 

Residuals: 
    Min  1Q Median  3Q  Max 
-6.7333 -3.2333 -0.9067 2.8483 9.3667 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 16.107  1.216 13.250 7.87e-14 *** 
grpsT=4-  8.427  1.823 4.621 7.26e-05 *** 
grpsT=4+  5.273  2.431 2.169 0.0384 * 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 4.708 on 29 degrees of freedom 
Multiple R-squared: 0.4292, Adjusted R-squared: 0.3898 
F-statistic: 10.9 on 2 and 29 DF, p-value: 0.0002948 



tidy(fit) 

     term estimate std.error statistic  p.value 
1 (Intercept) 16.106667 1.215611 13.249852 7.867272e-14 
2 grpsT=4- 8.426667 1.823417 4.621361 7.257382e-05 
3 grpsT=4+ 5.273333 2.431222 2.169005 3.842222e-02 

だから私は、あなたがレベルを確認する必要があり、なぜそれが明確ではありませんあなたがする、または

  • 必要以上にあなた自身に難しいものを作っている

    1. いずれかのことを考えて左によ構文的に有効なオブジェクト名。
  • +1

    私は(バイオインフォマティクス)詳細を知りたくはありませんでしたが、私はlimmaパッケージを使ってマイクロアレイのようなデータセットから線形モデルを作成しています。 makeContrastsを実行しているときに、有効な名前を作成しないと、次のエラーメッセージが表示されます。 警告:makeContrastsのエラー:レベルはヘルプ(make.names)を参照してください。無効な名前:T = 4-、T = 4 + 簡単なことをするのは当然のことですが、私はここで名前を変更しないで逃げるとは思っていません。 – MartijnVanAttekum

    関連する問題