【问题标题】:Getting a factor error when aggregating a table but no columns are factors聚合表时出现因子错误但没有列是因子
【发布时间】:2019-07-03 02:44:10
【问题描述】:

所以我从 csv 文件上传了我的数据。我尝试使用stringsAsFactors = FALSE 上传它,但仍然出现错误。前 13 列是字符串,其余列(从 14 列开始)都是数字。核心代码如下:

library("readxl")

# Read data with facotr is False 
data <- read.csv("PFR csvData.csv",stringsAsFactors = FALSE)

# Convert all numeric rows to numeric
data[,14:length(colnames(data))]<- as.numeric(as.character(unlist(data[,14:length(colnames(data))])))

# Convert all string rows to characters
data[,1:13]<- as.character(unlist(data[,1:13]))

当我通过sapply(data, class) 检查每一列的类时,我得到:

           Rk           Player              Pos              Age             Date               Lg               Tm 
     "character"      "character"      "character"      "character"      "character"      "character"      "character" 
             H.A              Opp           Result               G.             Week              Day    Receiving_Tgt 
     "character"      "character"      "character"      "character"      "character"      "character"        "numeric" 
   Receiving_Rec    Receiving_Yds    Receiving_Y.R     Receiving_TD  Receiving_Ctch.  Receiving_Y.Tgt    Receiving_PPR 
       "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric" 
     Passing_Cmp      Passing_Att     Passing_Cmp.      Passing_Yds       Passing_TD      Passing_Int     Passing_Rate 
       "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric" 
      Passing_Sk   Passing_Sk_Yds      Passing_Y.A     Passing_AY.A      Passing_PPR      Rushing_Att      Rushing_Yds 
       "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric"        "numeric" 
     Rushing_Y.A       Rushing_TD Rushing_Half_PPR   Total_Half_PPR 
       "numeric"        "numeric"        "numeric"        "numeric" 

我还通过apply(data, 2, function(x) any(is.na(x)))检查了NAs并获得:

              Rk           Player              Pos              Age             Date               Lg               Tm 
           FALSE            FALSE            FALSE            FALSE            FALSE            FALSE            FALSE 
             H.A              Opp           Result               G.             Week              Day    Receiving_Tgt 
           FALSE            FALSE            FALSE            FALSE            FALSE            FALSE            FALSE 
   Receiving_Rec    Receiving_Yds    Receiving_Y.R     Receiving_TD  Receiving_Ctch.  Receiving_Y.Tgt    Receiving_PPR 
           FALSE            FALSE            FALSE            FALSE            FALSE            FALSE            FALSE 
     Passing_Cmp      Passing_Att     Passing_Cmp.      Passing_Yds       Passing_TD      Passing_Int     Passing_Rate 
           FALSE            FALSE            FALSE            FALSE            FALSE            FALSE            FALSE 
      Passing_Sk   Passing_Sk_Yds      Passing_Y.A     Passing_AY.A      Passing_PPR      Rushing_Att      Rushing_Yds 
           FALSE            FALSE            FALSE            FALSE            FALSE            FALSE            FALSE 
     Rushing_Y.A       Rushing_TD Rushing_Half_PPR   Total_Half_PPR 
           FALSE            FALSE            FALSE            FALSE 

所以在这一点上,我认为我上传了没有因子的数据,通过强制它们的类型确保所有列都不是因子,并通过查看每列的类来仔细检查。我还确保没有 NAs

但是,当我使用我的聚合函数时,我收到与因素有关的错误:

aggregate(data$Player, by = list(data$Total_Half_PPR), FUN = sum)
Error in Summary.factor(291L, na.rm = FALSE) : 
  ‘sum’ not meaningful for factors

我不知道还能做什么。任何帮助表示赞赏!

【问题讨论】:

    标签: r dataframe factors


    【解决方案1】:

    “玩家”是factor。我们需要转换成numeric

    data$Player <- as.numeric(as.character(data$Player))
    

    如果我们需要获取 'Total_Half_PPR' 的 sum,请以另一种方式进行

    aggregate(data$Total_Half_PPR, by = list(data$Player), FUN = sum)
    

    或使用公式法

    aggregate(Total_Half_PPR ~ Player, data, FUN = sum)
    

    【讨论】:

    • 这样有效,但没有达到预期。也许我误解了聚合的使用。我想要得到的是每个玩家的“总一半 PPR”列的总和 - 即玩家 A - 300,玩家 B - 200 等等。如果我将播放器转换为数字,我会丢失实际的播放器名称。关于如何找到我正在寻找的任何建议,这相当于 SQL 中的以下内容:select player, sum(Total_Half_PPR) from table group by player
    • @scuden 是另一种方式;请检查更新
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2017-12-25
    • 2018-06-24
    • 1970-01-01
    • 2018-08-07
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多