2017-01-02 48 views
-1

我有一個R問題困擾了我一段時間。我有一個dataframe(df),它包含變量A和B,它們都是數字(正數)。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 

然後我子集中的數據像這樣:

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對象,每一列可以是一個類型,即數字或字符(分類)。在你的例子的B列中,'1,5'是字符,但是這會導致錯誤,而不是C列中的結果。這使我認爲它是全部數字。比較數字時,應使用「相同」或「all.equal」。如果A和B相等,你除以0,這就是爲什麼你得到Inf或-Inf。 – LyzandeR

+1

如果您嘗試'1 ==「1」',您將得到'TRUE',因爲數字'1'首先轉換爲字符'「1」',然後進行比較,類似地,當數字和字符串聯時,數字變爲成爲一個角色 –

+0

Hi @LyzandeR,對不起,它是1.5而不是1,5。你說的對,據說df的所有列都有相同的格式,事實上情況就是這樣。 A和B都是數字。 C也是如此。我用我給出的例子來說明真實場景可以呈現的多樣性,是的,一旦我將A除以0,我應該得到Inf或-Inf,這對某些值是正確的。儘管有時它給了我一個巨大的價值(與Inf的Infin不同)。我不能在這裏完全表示它,因爲我的數據集有一些千兆字節和大約10萬行的真實客戶數據。雖然我對這個 –

回答

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")我沒有得到第四行。如果我做subset(df, df$C==-217.6471),也不會得到第4行,這可能是因爲df$C的第4個值不完全是-217.6471,而是四捨五入到小數點後第四位。

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

如果我做subset(df, df$C==Inf)然後我得到的df第二排,符合市場預期。 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認爲當C被創建時,有什麼東西在與它混淆......我對所有變量都是數字都是肯定的。好吧,round消除了數字和分類的問題(但是因爲它根本沒有任何類型的小數位),但是,當A和B相等時,有時我會得到-Inf或Inf,有時我會得到一個很大的值..說實話,它就像100k中的4或5行..但它仍然很奇怪 –

0

我不認爲在R中可以有一個不同數據類型的列。通常在R分類中是定性變量,其具有作爲數據類型的因子。分類也可以是數字,但數據類型仍然是因子。

您能否提供一個數據框架樣本,因爲這個問題並不十分清楚。也顯示我們預期的產出。謝謝

+0

嗨,你是對的。據我所知,在同一列中不能有不同的數據類型。雖然,在DF $ C真實數據進行表我得到 -883198108173860992 -877023250872270848 -581091895279616256 -189299.99999997 \t \t \t 我可以用三個值(所以輸出將子集中的數據集是一條線,因爲每個值只有一個觀察值)。對於第四個值,我只能使用「」對數據集進行子集化。 –

+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