【问题标题】:Why do the summary and class methods disagree on type in my data.frame in R? [duplicate]为什么摘要和类方法在 R 中我的 data.frame 中的类型不一致? [复制]
【发布时间】:2023-03-11 17:24:01
【问题描述】:

这是设置:

mydf<-structure(list(weight = c(1.34288799762726, 1.18884372711182, 
1.15979790687561, 1.34288799762726, 1.08285343647003, 1.07932889461517, 
1.28913342952728, 1.211909532547, 1.03438591957092, 1.22719633579254
), RespID = c(3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 
3190, 3191), b1 = structure(c(1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 
2L, 2L), .Label = c("Mand", "Kvinde"), class = "factor")), .Names = c("weight", 
"RespID", "b1"), row.names = c(NA, 10L), class = "data.frame")

现在对 summary 的调用将生成以下输出:

summary(mydf)
#     weight          RespID          b1   
# Min.   :1.034   Min.   :3182   Mand  :4  
# 1st Qu.:1.102   1st Qu.:3184   Kvinde:6  
# Median :1.200   Median :3186             
# Mean   :1.196   Mean   :3186             
# 3rd Qu.:1.274   3rd Qu.:3189             
# Max.   :1.343   Max.   :3191            

同时 apply 给出另一个结果:

apply(mydf, 2, class)
#     weight      RespID          b1 
#"character" "character" "character" 

因此,根据应用,我的 data.frame 中的每一列都属于“字符”类,我知道这是错误的。总结是正确的。

【问题讨论】:

  • ?apply的第一句写着:“如果X不是一个数组而是一个具有非空dim值的类的对象(比如一个数据框),apply尝试强制它如果它是二维的(例如,数据框)或通过 as.array,则通过 as.matrix 到数组。”矩阵只能保存一种数据类型。
  • apply 适用于数组,而不是 data.frames - 这可能是burns-faq no。 89383772

标签: r dataframe


【解决方案1】:

发生这种情况的原因是apply 需要一个矩阵

> as.matrix(mydf)
   weight     RespID b1      
1  "1.342888" "3182" "Mand"  
2  "1.188844" "3183" "Kvinde"
3  "1.159798" "3184" "Mand"  
4  "1.342888" "3185" "Mand"  
5  "1.082853" "3186" "Kvinde"
6  "1.079329" "3187" "Kvinde"
7  "1.289133" "3188" "Mand"  
8  "1.211910" "3189" "Kvinde"
9  "1.034386" "3190" "Kvinde"
10 "1.227196" "3191" "Kvinde"

你要使用的是sapply:

> sapply(mydf,class)
   weight    RespID        b1 
"numeric" "numeric"  "factor" 

【讨论】:

    【解决方案2】:

    apply 强制转换为 matrix,其中 不能 包含 factor,因此它被强制转换为字符变量:

    df <- data.frame( x = as.factor(letters[1:3]) , y = as.factor(LETTERS[1:3]) )
    str(df)
    'data.frame':   3 obs. of  2 variables:
     $ x: Factor w/ 3 levels "a","b","c": 1 2 3
     $ y: Factor w/ 3 levels "A","B","C": 1 2 3
    
    apply(df,2,class)
              x           y 
    "character" "character" 
    
     sapply(df,class)
           x        y 
    "factor" "factor" 
    

    【讨论】:

      【解决方案3】:

      我找到了原因。

      似乎 apply 会将 data.frame 强制转换为矩阵,从而导致每一列都存储为字符类型。 apply 方法当然会在转换后报告类。诀窍是要意识到 data.frame 是一个美化列表,因此

      lapply(mydf, class)
      # $weight
      # [1] "numeric"
      # 
      # $RespID 
      # [1] "numeric"
      # 
      # $b1
      # [1] "factor"
      

      给出正确答案。

      【讨论】:

      • 或者,如果你想要一个矢量结果而不是一个列表,sapply(mydf, class)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多