【问题标题】:subsetting error in RR中的子集错误
【发布时间】:2014-06-08 02:08:37
【问题描述】:

我有一个名为dualbeta 的大型dataframe,其中包含2 行6080 列。这是一个示例:

row.names     A.Close   AA.Close    AADR.Close  AAIT.Close  AAL.Close
1   upside    1.253929  0.9869027   0.6169613   0.6353903   0.1782124
2   downside  1.027412  1.1936236   0.5915299   0.5697878   0.1702382

我试图仅提取具有upside >= 1.00 的那些和具有downside combinations <- subset(dualbeta, upside>=1.00 & downside<=1.00),但得到以下信息:

row.names   A.Close     AA.Close     AADR.Close  AAIT.Close 
1 NA          NA          NA            NA          NA  
2 NA.1        NA          NA            NA          NA  
3 NA.2        NA          NA            NA          NA  
4 NA.3        NA          NA            NA          NA  
5 NA.4        NA          NA            NA          NA  
...

它应该只返回一个2 by x 表,其中 x 是找到的组合数。我不知道为什么我得到一堆行?此外,我认为我在dualbeta 中有NA 值,所以我使用了na.omit(dualbeta)-&gt;dualbeta,但它删除了所有内容并将dualbeta 变成了0 by 6080。我还使用了which(is.na(dualbeta)),它返回了33073308,但是当我检查这些列时,它们不包含NA。

【问题讨论】:

  • subset 作用于列名,而不是行值。那么当你说upside&gt;1.00 时,那一行中的哪个值是“上行”?
  • @MrFlick 我明白了。但即使我使用combinations &lt;- subset(dualbeta, dualbeta[1,]&gt;=1.00 &amp; dualbeta[2,]&lt;=1.00) 我仍然遇到同样的问题
  • 嗯,你的第一列是名字,对吧(dualbeta[1,])? “upside”这个名字怎么会大于1.00?你没有收到任何警告吗?也许你应该用dput(head(dualbeta)) 的结果替换你的样本数据,这样我们就可以看到你真正使用的是什么类型的对象。
  • 哦,对不起。我明白了,dualbeta[1,] 是行,而不是列。无论如何,您不能使用subset 来对这样的列进行子集化。 subset 仅适用于行。
  • @MrFlick dualbeta[1,] 包含 upside 的值。例如dualbeta[1,1] 返回1.253929,这是A.Close 的优势。

标签: r subset


【解决方案1】:

您可以对数据进行转置,以便选择具有适当特征的行(即转置中的列):

# Fix up the data, use proper row names
rownames(x) <- x$row.names
# Remove old row name column
x <- x[-1]

# transpose and subset
subset(data.frame(t(x)), upside > 1 & downside < 1)

此表达式返回一个长度为零的结果以及您的示例数据。更改参数显示返回的内容:

subset(data.frame(t(x)), upside > .6 & downside < .6)
##               upside  downside
## AADR.Close 0.6169613 0.5915299
## AAIT.Close 0.6353903 0.5697878

【讨论】:

    【解决方案2】:

    您可以通过简单的索引来获取数据。

    假设这是您的数据

    dualbeta<-data.frame(matrix(runif(24,0,2), 
        nrow=2, 
        dimnames=list(c("upside","downside"), letters[1:12])))
    

    然后你可以提取

    dualbeta[, dualbeta[1,]>=1.00 & dualbeta[2,]<=1.00]
    

    【讨论】:

    • 此代码返回:Error in [.data.frame(dualbeta, , dualbeta[1, ] &gt;= 1 &amp; dualbeta[2, ] &lt;= : undefined columns selected
    • @Jason 我添加了一个示例数据集。根据您的描述,它听起来与您的数据格式相同。我不确定它怎么可能不同。该代码对我来说很好。
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2018-05-30
    • 2018-07-28
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多