【问题标题】:Subset function is not creating a subset of rows, but is instead changing values to zero子集函数不是创建行的子集,而是将值更改为零
【发布时间】:2015-11-29 19:59:44
【问题描述】:

我有一个包含行名和列名的数据框。

    0.01    0.02    0.03   0.04   0.05 ...  Percent
J1   458    -160    -151    -52    -67        0.53
J2   459    -163    -154    -46    -92        0.01 
J3   457    -165    -150    -51   -245        0.27
J4   402    -297    -87     -93   -122        1.00
...

我想创建一个数据子集,其中仅包含百分比列

C5.Subset<- subset(C5.Outliers, Percent<=0.5) 

我希望的输出是这样的:

    0.01    0.02    0.03   0.04   0.05 ...  Percent
J2   459    -163    -154    -46    -92        0.01 
J3   457    -165    -150    -51   -245        0.27
...

但是,我得到的输出与预期的非常不同。 R 没有创建一个排除百分比 >0.5 的行的新表,而是将这些行的百分比列中的值替换为零。这是我得到的结果表:

    0.01    0.02    0.03   0.04   0.05 ...  Percent
J1   458    -160    -151    -52    -67           0
J2   459    -163    -154    -46    -92        0.01 
J3   457    -165    -150    -51   -245        0.27
J4   402    -297    -87     -93   -122           0
...

我想实际删除这些行。我做错了什么?

仅供参考,此可重现示例的代码在输入后即可运行。我的实际数据框来自具有相同列名和行名 (dim=17x600) 的 CSV 文件。

【问题讨论】:

  • 请提供可重现的示例....?
  • WTF?你说这是一个矩阵!并且....如果那是从带有 read.csv 的 csv 文件中引入的,那将不是列名
  • 所以在尝试了您的代码并且没有出现错误行为后,我倾向于将其关闭为不可重现,除非您可以提供一个实际说明假定问题的示例。
  • @joran 说了什么。你有一个奇怪的subset() 掩盖了基本版本吗? (1) find("subset") (2) sessionInfo() 的结果好吗?
  • 另外,感谢大家的耐心等待,因为我是 R 和 Stack 的新手。

标签: r subset


【解决方案1】:

对于第二个版本的问题,经过测试的回答是:

> subset( C5.Outliers, Percent < 0.5)
    X0.01 X0.02 X0.03 X0.04 X0.05 Percent
J 2   459  -163  -154   -46   -92    0.01
J 3   457  -165  -150   -51  -245    0.27

所以和 joran 一样,我认为你继续对你正在使用的对象类型撒谎。

===== 回答原始问题==========

我最初的反应是“子集仅用于向量和数据帧”,但手册另有说明。但是,如果您查看subset.matrix 的代码(此类事务的最终权威),您会发现subset.data.frame 中可爱的非标准评估技巧在矩阵方法中不存在。您需要创建一个正确的表达式,该表达式返回一个逻辑向量作为子集参数的参数,该子集参数是面向行的参数。对要选择的参数进行了一些评估,但您想要一个行选择过程。这是一个匹配你的矩阵和一个'子集'-ation的例子

mat <- structure(c(458, 459, 457, 402, -160, -163, -165, -297, -151, 
-154, -150, -87, -52, -46, -51, -93, -67, -92, -245, -122, 0.53, 
0.01, 0.27, 1), .Dim = c(4L, 6L), .Dimnames = list(c("J1", "J2", 
"J3", "J4"), c("0.01", "0.02", "0.03", "0.04", "0.05", "Percent"
)))

> subset(mat, mat[,'Percent']< 0.5)
   0.01 0.02 0.03 0.04 0.05 Percent
J2  459 -163 -154  -46  -92    0.01
J3  457 -165 -150  -51 -245    0.27

似乎更容易坚持使用“[”作为矩阵。

【讨论】:

  • 好的...我刚刚在上面编辑了我的问题(应该写的是“数据框”而不是矩阵。)我一直在使用 csv 文件,我的行名包括字母。我的理解是矩阵通常只包含数字数据?因此,如果我有一个包含字母的 csv 文件,那么我假设 R 会将其作为数据框读取?如果 R 有可能将文件作为矩阵读取,那么您发布的回复可能确实是我的问题。
  • 矩阵(在 R 中)可以是逻辑、字符、数字或列表类型之一。它们可能没有语言元素,但这是对类型的唯一限制。它们不允许有额外的属性,因此它们不能包含日期或因素。
  • “谎言”似乎有点强,暗示有误导的意图。 “感到困惑”? “歪曲”?
  • 刚刚尝试使用 data.frame(C5.Outliers) 将其转换为数据框,之后运行分析时仍然遇到同样的问题。
  • @BenBolker 是的。说它是谎言可能太强了。一旦尘埃落定,我将删除我的指控,但目前我们真正需要的不是一些令人困惑的虚假陈述,而是来自dput( head( C5.Outliers)) 的输出
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多