R中的CSV标称值'错误识别

时间:2014-01-01 10:08:29

标签: r excel ms-access csv

我在MS Access中将数字声明为文本(名义上为a.k.a.)。这些数字代表了可能长句作为类别的简化版本。

我目前尝试以三种方式将文件导出为csv

  1. MS Access'原生csv功能
  2. MS Excel的本机csv功能(来自MS Access)
  3. LibreOffice Calc的“使用文本CSV格式”;我甚至检查“引用所有文本单元格”选项以确保所有名义值都得到处理。
  4. 当我尝试使用summary(data)并且看到这些数字 - 名义值仍被解释为数字时,问题出在R中,即使这些值用双引号或单引号括起来。我确信这一点,因为我看到这些变量(在summary函数中)给出了均值,中位数和其他变量与具有频率的字符进行比较。

    在下面的示例中,var1var2都是名义上的,其中后者由数字表示(请注意,为了安全起见,var2结果的值会发生变化)。

    var1            var2
    Cat  : 111   Min.   :1   
    Dog  : 222   1st Qu.:1   
    Bee  : 333   Median :8   
    Yog  : 555   Mean   :10   
    Fig  : 999   3rd Qu.:1
    Kol  : 444   Max.   :15                                      
    (Other):2250
    

    我曾考虑在这些数字名义值上添加一个字符(而不是1, 2, 3, 4, 5,我会1a, 2a, 3a, 4a, 5a)以确保将这些字符解释为名义值,但我希望在进行那项艰巨的任务之前,这里有一个新的解决方案。

1 个答案:

答案 0 :(得分:1)

read.table和家人有一个colClasses参数。

请参阅以下示例,了解使用不同colClasses时结果的差异:

样本数据

text <- c("A,B,C", "1,2,3", "2,1,4")

默认read.csv

A <- read.csv(text = text)
str(A)
# 'data.frame':  2 obs. of  3 variables:
#  $ A: int  1 2
#  $ B: int  2 1
#  $ C: int  3 4
summary(A)
#       A              B              C       
# Min.   :1.00   Min.   :1.00   Min.   :3.00  
# 1st Qu.:1.25   1st Qu.:1.25   1st Qu.:3.25  
# Median :1.50   Median :1.50   Median :3.50  
# Mean   :1.50   Mean   :1.50   Mean   :3.50  
# 3rd Qu.:1.75   3rd Qu.:1.75   3rd Qu.:3.75  
# Max.   :2.00   Max.   :2.00   Max.   :4.00  

character

的形式读取数据
B <- read.csv(text = text, colClasses = "character")
str(B)
# 'data.frame': 2 obs. of  3 variables:
#  $ A: chr  "1" "2"
#  $ B: chr  "2" "1"
#  $ C: chr  "3" "4"
summary(B)
#     A                  B                  C            
# Length:2           Length:2           Length:2          
# Class :character   Class :character   Class :character  
# Mode  :character   Mode  :character   Mode  :character  

factor

的形式读取数据
C <- read.csv(text = text, colClasses = "factor")
str(C)
# 'data.frame': 2 obs. of  3 variables:
#  $ A: Factor w/ 2 levels "1","2": 1 2
#  $ B: Factor w/ 2 levels "1","2": 2 1
#  $ C: Factor w/ 2 levels "3","4": 1 2
summary(C)
#   A     B     C    
# 1:1   1:1   3:1  
# 2:1   2:1   4:1

colClasses参数接受vector,因此您可以逐列指定值应该是什么:

D <- read.csv(text = text1, colClasses = c("integer", "character", "factor"))

str(D)
# 'data.frame':  2 obs. of  3 variables:
#  $ A: int  1 2
#  $ B: chr  "2" "1"
#  $ C: Factor w/ 2 levels "3","4": 1 2
summary(D)
#        A             B             C    
#  Min.   :1.00   Length:2           3:1  
#  1st Qu.:1.25   Class :character   4:1  
#  Median :1.50   Mode  :character        
#  Mean   :1.50                           
#  3rd Qu.:1.75                           
#  Max.   :2.00