当数据框是小标题时无法识别变量的结构

Structure of variables not recognised when dataframe is a tibble

我创建了一个函数来评估输入变量的结构,然后根据变量的含义、数字的均值和 sd 以及因子的频率和比例执行条件描述性统计。

但是,当数据框是小标题时,我用来识别变量结构的方法似乎不起作用。这是一些玩具数据

set.seed(123)
df <- tibble(a = round(rnorm(5),1),
             b = factor(letters[1:5]))
glimpse(df)

# Output
# Rows: 5
# Columns: 2
# $ a <dbl> -0.6, -0.2, 1.6, 0.1, 0.1
# $ b <fct> a, b, c, d, e

现在,如果我们询问 R 每列使用的是什么类型的变量,is.x() 函数套件会失败

is.numeric(df[,"a"])
# [1] FALSE

is.factor(df[,"b"])
# [1] FALSE

但是,如果我们将数据帧转换为 data.frame 类型 object 它会正确识别它们

df <- as.data.frame(df)

is.numeric(df[,"a"])
# [1] TRUE

is.factor(df[,"b"])
# [1] TRUE

现在我当然可以在我的函数中将 data.frame 转换为一个 tibble,但我只是好奇如何获得带有 tibble 或一些 data.frame 的结果等效的解决方法?

答案是使用 [[ 对 tibble 或数据框中的列进行子集化,这将为您提供一致的结果。为了区分 dataframe 和 tibble,我们将 tibble 变量称为 df_tib,将 dataframe 变量称为 df_dat.

df_tib <- df
df_dat <- data.frame(df)

is.numeric(df_tib[['a']])
#[1] TRUE
is.numeric(df_dat[['a']])
#[1] TRUE

is.factor(df_tib[['b']])
#[1] TRUE
is.factor(df_dat[['b']])
#[1] TRUE

出现问题的原因是它们(数据框和 tibble)在使用 [ 子集时如何反应。

df_tib[, 'a']

# A tibble: 5 x 1
#      a
#  <dbl>
#1  -0.6
#2  -0.2
#3   1.6
#4   0.1
#5   0.1

df_dat[, 'a']
#[1] -0.6 -0.2  1.6  0.1  0.1

df_tib return 当您使用 [ 子集时,它是一个 tibble,而由于您在 df_dat 中只有一个列,它 return 是一个向量。 is.factoris.numeric 总是 return FALSE 在 dataframe/tibble 对象上。