【问题标题】:Subset in R not removing rows in data frameR中的子集不删除数据框中的行
【发布时间】:2019-09-07 23:42:20
【问题描述】:

总结这个过程,我从 bbref 中提取数据,在数据框中对其进行结构化,将 3 个向量从字符转换为数字,并选取玩超过 20 场游戏的玩家子集。然而,当我重新排序数据并显示前 20 名时,只删除了一些非预选赛,并且仍然有很多观察不到 20 场比赛。

library(XML)
library(RCurl)
library(plyr)

urladv <- "https://www.basketball-reference.com/leagues/NBA_2019_advanced.html"
urladvdata <-  getURL(urladv)
dataadv <- readHTMLTable(urladvdata, stringsAsFactors = FALSE, encoding = "UTF-8")
datadv <- structure(dataadv, row.names =c(NA, -734), .Names = seq_along(dataadv), class = "data.frame")
advstats <- ldply(dataadv, data.frame)
advstats[,c('PER', 'BPM')] <- sapply(advstats[,c('PER','BPM', 'G')], as.numeric)
advstats <- subset(advstats, G > 20)
advstats <- advstats[with(advstats,order(-PER)),]
advstats[1:20,]

advstats[1:20,] 的输出包括像 Trevon Duval、Gary Payton 和 Alan Williams 这样的球员,他们每个人都打了 5 场或以下比赛。我很困惑这些观察的特殊情况是什么,因为子集删除了 100 多个观察。

【问题讨论】:

  • 仅供参考,如果您将代码与用于标记代码的 ``` 写在同一行,这会告诉降价解析器该文本是要使用的语言,而不是一行代码。在我添加新行之前,我们看不到您正在使用的网址
  • 感谢@camille 的通知
  • 我认为subset 没有为G&gt;20 做你想要的,因为G 仍然是一个字符串而不是数字。对于sapply,您是否缺少G 的分配?应该是advstats[,c('PER', 'BPM', 'G')] &lt;- sapply(advstats[,c('PER','BPM', 'G')], as.numeric)
  • @Ben 你说得对,G 不见了。包含它可以修复子集行为。

标签: r subset


【解决方案1】:

正如 Ben 在 cmets 中提到的,您在执行 sapply() 的行中缺少 'G'。它应该是这样的:

advstats[,c('PER', 'BPM', 'G')] <- sapply(advstats[,c('PER','BPM', 'G')], as.numeric)

因为您缺少&lt;- 左侧的'G',所以它没有将'G'&lt;chr&gt; 转换为&lt;dbl&gt; 数据类型。因此,当您运行 subset() 函数时,它不起作用,因为您不能对字符数据类型使用数学运算符。

我相信这会有所帮助?

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2018-10-06
    • 2011-12-16
    • 1970-01-01
    • 2020-08-16
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多