Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R、 不同格式的df中的变量?_R - Fatal编程技术网

R、 不同格式的df中的变量?

R、 不同格式的df中的变量?,r,R,我有一个问题困扰了我一段时间。我有一个数据帧(df),它包含变量a和B,这两个变量都是数字(正的) 然后我执行以下计算: df$C <- (( df$A / (df$B - df$A)) -1 ) * 100 然后我将数据子集如下: subset(df, df$C == X) 其中X显然是一个值。虽然,我发现如果X==400,那么它工作,否则,如果X==217.6471,它不工作。相反,我需要使用X==“-217.6471”,这意味着变量是分类的(如果我错了,请纠正我)。或者,换句话

我有一个问题困扰了我一段时间。我有一个数据帧(df),它包含变量a和B,这两个变量都是数字(正的)

然后我执行以下计算:

df$C <- (( df$A / (df$B - df$A)) -1 ) * 100
然后我将数据子集如下:

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”和其他一些随机值(我认为这是垃圾值)

有人能给我解释一下怎么了吗


提前感谢

我复制了你所做的,但我没有得到相同的结果

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)

如果我做了
子集(df,df$C==Inf)
,那么我得到了第二行
df
,正如预期的那样
df$C
是一个完全数字的列;它不是由一些数值和一些分类值组成的。通过执行
class(df$C)
str(df)
可以看到这一点。我认为这甚至不可能用于R中的数据帧。为了将不同类型的变量混合在一起,您需要在R中创建一个
列表

我不认为在R中您可以有一个具有不同数据类型的列。在R中,通常是定性变量,以factor作为数据类型。分类也可以是数字,但数据类型仍然是因素


您能否提供一个数据帧示例,因为这个问题并不十分清楚。还显示我们的预期产量。谢谢

我想这可以解决问题。每次使用乘除运算时,都需要显式舍入:

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

df这个问题并不清楚。如果有data.frame对象,则每列可以是一种类型,即数字或字符(分类)。在示例的B列中,
1,5
是字符,但这将导致错误,而不是C列中的结果。这使我认为这都是数字。比较数字时,应使用
idential
all.equal
。如果A和B相等,则除以0,这就是得到Inf或-Inf的原因。如果尝试
1==“1”
,则得到
TRUE
,因为数字
1
首先转换为字符
“1”
,然后进行比较,类似地,当数字和字符同时链接时,数字变成字符hi@LyzandeR,对不起,是1.5而不是1.5。您是对的,假设df的所有列都具有相同的格式,事实上就是这样。A和B都是数字。C也是如此。通过我给出的示例,我试图说明真实场景可以呈现的变化,是的,一旦我将A除以0,我应该得到Inf或-Inf,这对于某些值是正确的。虽然有时它给我一个巨大的价值(不同于Inf的-Inf)。我不能在这里完整地表示它,因为我的数据集有一些千兆字节和大约10万行的真实客户数据。尽管我对此持肯定态度,但hi@joel.wilson。你说的对我来说很有意义。尽管我应该如何解释实际数据集所包含的值-883198108173860992?事实上,这可以按原样在子集中使用,但对于使用值-189299.9999997的数据集子集,我必须使用“”。我觉得这很奇怪。嗨。这对我来说也没有意义。现在,我将使用实值更好地解释我的问题:如果我做一个表(df$C),我得到:-Inf-883198108173860992-877023250872270848 76 1-581091895279616256-189299.999997 1,当我为(-883198108173860992)子集数据时没问题。尽管如此,我只能使用“”将数据集子集化为-189299.9999997。(我已经证实了这一点)。另外,我检查了-Inf的A和B值,它们是相等的,但是剩余的值是相同的。这很奇怪,不知道还有什么要说。您确定
df$A
df$B
也是数字列吗?如果不是这样,那可能就是你在创建
df$C
时弄乱的地方。你认为在创建C时有什么东西弄乱了它吗。。我对所有变量都是数字持肯定态度。。嗯,舍入消除了数字和分类的问题(但因为它根本没有任何形式的小数点),但是,当A和B相等时,有时我得到-Inf或Inf,有时我得到一个大值。。老实说,这就像10万行中的4到5行。。但这仍然很奇怪嗨,是的,你是对的。据我所知,同一列中不能有不同的数据类型。虽然在df$C real data中执行表时,我得到-883198108173860992-877023250872270848 1-581091895279616256-189299.999997 1 1,但我可以使用前三个值对数据集进行子集化(因此输出将是一行,因为每个值只有一个观察值)。对于第四个值,我只能使用“”对数据集进行子集划分。您需要在使用乘除运算时进行四舍五入。看吧,没错。但是四舍五入部分地解决了这个问题。。因为它去掉了小数点。没问题,它理解为数字。。然而,当A和B相等时,有时我得到-Inf或Inf。。其他时候我会得到这些极值。不知道为什么:-/
 ID   A   B   C
  1   3   2   num
  2   2   2   Cat
  3   4   2   num
  4   10  1.5 Cat
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==Inf)
  A B   C
2 2 2 Inf
> class(df$C)
[1] "numeric"
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