2017-01-02 49 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