确定数据框列的数据类型。

217
我正在使用 R,并使用 read.csv() 将数据加载到数据帧中。我该如何确定数据帧中每列的数据类型?

3
编程方式(例如sapply(...,class))或交互式方式(例如str(...))或两者都要?通常更具可扩展性的方法是通过编程实现,这样您可以随意使用Filter(...)过滤整数、字符、因子等列表。或者,如果命名遵循任何命名约定,您可以使用grep/greplnames(...)推断列类型。 - smci
@smci:我在原始问题中并没有要求“以编程方式”,我不知道为什么你会改变我的问题的本质。 - stackoverflowuser2010
好的,它已经被回滚了。它没有改变整个性质,而是在两个方向中澄清了其中一个。使用 str(...) 的交互式方法不可扩展,并且在<100列上失去了效力。 - smci
11个回答

290

开始的最佳选择是使用?str()。为了探索一些示例,让我们制作一些数据:

set.seed(3221)  # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5), 
                      x1=c(1:5), 
                      x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                      X3=letters[1:5])

@Wilmer E Henao H的解决方案非常简洁:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

使用 str() 函数可以获得额外的信息(例如因子的水平和每个变量的前几个值):

使用str()函数可以获得额外的信息(例如因子的水平和每个变量的前几个值):

str(my.data)
'data.frame':  5 obs. of  4 variables:
$ y : num  1.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

@Gavin Simpson 的方法也是简化的,但提供的信息与 class() 稍有不同:

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

有关 classtypeof 和中间类型 mode 的更多信息,请参阅此优秀的 SO 主题帖:R 中各种类型的全面调查。'mode'、'class' 和 'typeof' 是不够的


2
使用R几个月后,我发现str(dataframe)是一种快速查看列类型的最佳方式。其他方法需要更多的按键并且不显示太多信息,但如果列数据类型是其他函数的输入,则它们很有帮助。 - stackoverflowuser2010
嗨,当我使用apply而不是apply时,它没有起作用。 - Dom Jo
@DomJo,你为什么要使用apply()?那是用于矩阵的。数据框是一种(特殊类型的)列表。 - gung - Reinstate Monica
1
因为sapply(foo, typeof)返回日期对象的"integer",所以我使用了sapply(foo, class)。但是,这可能会返回一个列表。因此,最终我使用了names(foo)[sapply(sapply(foo, class), function(x) { "Date" %in% x })]来识别foo中所有属于"class"的成员的列。 - carbocation

72
sapply(yourdataframe, class)

其中yourdataframe是你使用的数据框的名称


1
完美。正是我所需要的。 - Brian D

20

我建议

sapply(foo, typeof)

如果您需要数据帧中向量的实际类型,class()则稍有不同。

如果您不需要将此信息作为向量获取(即您不需要将其用于以后以编程方式执行其他操作),只需使用str(foo)

在两种情况下,foo都将替换为您的数据框的名称。


13

对于小型数据框:

library(tidyverse)

as_tibble(mtcars)

打印数据类型与数据的 df 。

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

对于大型数据框:

glimpse(mtcars)

为您提供了数据类型结构化的视图:

Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...

要获取列的数据类型列表(如@Alexandre所说):

map(mtcars, class)

提供了数据类型的列表:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

更改列的数据类型:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

将列mpgam转换为字符,并将列carb转换为整数:

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1

10
只需将您的数据框传递到以下函数中:
data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

绘制数据帧中所有数据类型的图表。 对于鸢尾花数据集,我们得到以下结果:

data_types(iris)

enter image description here


6
另一种选择是使用purrr包的map函数。
library(purrr)
map(df,class)

4

为了得到一个方便的数据框,这里有一个基本的简单函数。

col_classes <- function(df) {
  data.frame(
  variable = names(df),
  class = unname(sapply(df, class))
  )
}
col_classes(my.data)
  variable     class
1        y   numeric
2       x1   integer
3       x2   logical
4       X3 character

3

由于没有明确说明,我在这里补充一下:

我正在寻找一种方法来创建一个表格,其中包含所有数据类型的出现次数

假设我们有一个data.frame,其中包含两个数字列和一个逻辑列。

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

您可以通过这个功能,总结每种数据类型的列数。
table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

如果你有很多列并且想快速概览,这将非常方便。

致谢: 这个解决方案的灵感来自于@Cybernetic的回答


2
这里是helpRFunctions包中的一个函数,它将返回您的数据框中所有不同数据类型的列表,以及与该类型相关联的特定变量名称。
install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5), 
                  x1=c(1:5), 
                  x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                  X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric

您可以这样做:var(my.data[t$numeric])。希望这有所帮助!

1
值得注意的是,在底层,这是lapply(your_data, class),并进行了一些额外的格式处理。 - Gregor Thomas

2

如果您将csv文件导入为data.frame(而不是矩阵),您还可以使用summary.default函数。

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接