2017-01-02 11 views
-1

しばらく私を悩ましているRの質問があります。私は数値と(それについては正の)変数AとBを含むデータフレーム(df)を持っています。R、異なるフォーマットのdfの変数?

Assumptions: 
- A and B can be equal 
- A can be 0 
- B can be 0 

その後、私は次の計算を実行します。

df$C <- ((df$A/(df$B - df$A)) -1) * 100 

結果(DFます$ C)は、私が推測するすべての理にかなって数値ベクトル、です。私はdf $ Cの中でいくつかの変数は数値であり(例は5)、他のもの(1.5などの "。"を含む変数)はカテゴリとして解釈されます。

具体例は(Aは、すべての長さが同じ値を有すると仮定することができます同じことが変数Bのために行く。)従って

df$A <- 3 
df$B <- 2 

:そして

ID A B C 
    1 3 2 400 
    2 2 2 Inf 
    3 4 2 -300 
    4 10 1.5 -217.6471 

Iはデータのサブセット

subset(df, df$C == X) 

ここでXは明らかに値です。しかし、X == 400の場合、X == -217.6471なら動作しますが、動作しません。代わりに、私はX == "-217.6471"を使用する必要があります(私が間違っていれば私を修正します)とは、変数がカテゴリに属する​​ことを意味します。つまり、

ID A B C 
    1 3 2 num 
    2 2 2 Cat 
    3 4 2 num 
    4 10 1.5 Cat 

これはどのように可能ですか?

まだ、別の質問があります。 AとBが等しいときは、明らかに "Inf"、 "-Inf"とその他のランダムな値(私はそのゴミと考える)を得ます。

誰かが私に何か間違って説明できますか?事前

+0

この質問はそのままですが、明示的に丸める必要があります。 data.frameオブジェクトを使用している場合、各列は1つのタイプ、つまり数値または文字(カテゴリ)のいずれかになります。あなたの例の列Bでは '1,5'は文字ですが、それはエラーになります。結果はC列にはありません。これはすべて数字であると思います。数字を比較するときは、 'identical'または 'all.equal'を使うべきです。 AとBが等しい場合、0で割っているため、Infまたは-Infが得られます。 – LyzandeR

+1

'1 ==" 1 "'を試してみると、数値 '1'が最初に文字' '1 ''に変換されて比較されるので、 'TRUE'となり、数字と文字がcolinkされると同様に比較されます文字でなければなりません –

+0

こんにちは@LyzandeR、申し訳ありません、それは1.5であり、1,5ではありません。あなたは正しいと思いますが、dfには同じフォーマットのすべての列があり、実際はそうです。 AとBはともに数値です。私が与えた例では、実際のシナリオが示す多様性を説明しようとしています.Aを0で割ると、Infまたは-Infを取得する必要があります。これはいくつかの値に当てはまります。時にはそれは私に大きな価値を与えます(InfのInfとは異なります)。実際の顧客データでは、私のデータセットには数ギガバイトと100万行があるため、ここでは完全に表現できません。私はこれに肯定的ですが –

答えて

1

おかげで私はあなたが何をしたか、複製が、私は同じ結果を得ていませんよ。

df <- data.frame(A=c(3,2,4,10), B=c(2,2,2,1.5)) 
df$C <- ((df$A/(df$B - df$A)) -1) * 100 

> subset(df, df$C=="-217.6471") 
[1] A B C 
<0 rows> (or 0-length row.names) 
> subset(df, df$C==-217.6471) 
[1] A B C 
<0 rows> (or 0-length row.names) 

もし私がsubset(df, df$C=="-217.6471")なら、私は4番目の行を取得しません。 subset(df, df$C==-217.6471)を実行しても4行目が得られません。これは、df$Cの4番目の値が正確に-217.6471ではなく、4番目の10進数に丸められているためです。

> subset(df, df$C==Inf) 
    A B C 
2 2 2 Inf 
> class(df$C) 
[1] "numeric" 

私はsubset(df, df$C==Inf)を行う場合、期待どおり、私は、dfの2行目を取得します。 df$Cは完全に数値の列です。いくつかの数値といくつかのカテゴリの値で構成されていません。これはclass(df$C)またはstr(df)で確認できます。私はこれがRのデータフレームでも可能ではないと思います。さまざまな種類の変数を混在させるためには、Rでlistを作成する必要があります。

+0

こんにちは。私にも意味がありません。私は今より良い私の問題を説明するために実際の値を使用します。 それは私が私が得るテーブル(DFます$ C)を実行します。 -Inf -883198108173860992 -877023250872270848 -581091895279616256 -189299.99999997 \t \t データをサブセット化すると(-883198108173860992)問題ありません。ただし、 ""を使用してデータセットを-189299.99999997でサブセット化することはできます。 (私はこれを確認した)。プラス、私は-InfのAとBの値をチェックしていますが、それらは等しいですが、残っている値と同じです。 –

+0

何が言いたいのか分かりません。 'df $ A'と' df $ B'も数値列ですか?そうでなければ、 'df $ C'を作成するときに何が起こっているのかもしれません。 –

+0

Oを作成するときに何か問題があると思う..私はすべての変数が数値であることについて肯定的である。よく丸めれば、数値とカテゴリの周りの問題は解消される(ただし、小数点以下の桁はまったくない)、AとBが等しい時には、時々私は-InfかInfを得て、時には私は大きな価値を得る。それは100kで4行か5行のように正直である。しかしまだかなり変だ –

0

Rでは、異なるデータ型を持つ列。通常、Rのカテゴリには、因子をデータ型として持つ定性的な変数があります。 Categoricalは数値でも構いませんが、データ型は引き続きfactorになります。

この質問が本当に明確ではないため、データフレームサンプルを提供できますか?私たちは期待される出力を示します。ありがとう

+0

こんにちは、はい、あなたは正しいです。私が知る限り、同じ列内に異なるデータ型を持つことはできません。 DF $ C、実際のデータでテーブルを実行する、が、私は最初の3つの値を使用してデータセットをサブセットすることができます(そのため、出力がする -883198108173860992 -877023250872270848 -581091895279616256 -189299.99999997 \t \t \t を取得各値ごとに1つの観測値しかないため、1行にしてください)。 4番目の値については、 ""を使用してデータセットのみをサブセット化することができます。 –

+1

乗算と除算を使用するときはいつでも丸めなければなりません。上記を参照してください –

+0

そうです。しかし小数点以下は切り捨てるので、丸めは部分的に問題を解決します。いいえ。 " AとBが等しい時には、時々私は-InfかInfを得ます。他の時には私はこれらの極値をとります。ダニーの理由: - / –

1

これはそれを修正すると思います。

df <- data.frame(A=c(3,2,4,10), B=c(2,2,2,1.5)) 
df$C <- round(((df$A/(df$B - df$A)) -1) * 100, 4) 

subset(df, df$C== "-217.6471") 
A B   C 
4 10 1.5 -217.6471 
関連する問題