列出数据框中所有因子水平。

34

使用str(data),我可以获取到层级(1-2个值)的head

fac1: Factor w/ 2  levels ... :
fac2: Factor w/ 5  levels ... :
fac3: Factor w/ 20 levels ... :
val: num ...

使用 dplyr::glimpse(data) 我可以获得更多的值,但没有关于因子变量水平数量/值的信息。是否有自动获取数据框中所有因子变量的水平信息的方法?一种简短的形式具有更多信息:

levels(data$fac1)
levels(data$fac2)
levels(data$fac3)

更准确地说,是类似于优雅版本的某物

for (n in names(data))
  if (is.factor(data[[n]])) {
    print(n)
    print(levels(data[[n]]))
  }

谢谢,Christof

8个回答

33

以下是一些选项。我们使用sapply遍历“data”并获取每个列的levels(假设所有列都是factor类)。

sapply(data, levels)

或者如果我们需要使用管道 (%>%),可以这样做:

library(dplyr)
data %>% 
     sapply(levels)

另一种选择是使用dplyr中的summarise_each,在其中我们指定funs中的levels

 data %>%
      summarise_each(funs(list(levels(.))))

3
我们如何获得所有层级的长度。 - BigDataScientist
@BigDataScientist,请检查我的答案。 - Amit Kohli

9

如果您的问题是特别输出因子的所有级别列表,则我发现使用以下方法可以得到简单解决方案:

unique(df$x)

例如,对于臭名昭著的鸢尾花数据集:

unique(iris$Species)


6

或者使用 purrr:

data %>% purrr::map(levels)

或者首先将所有内容因式分解:
data %>% dplyr::mutate_all(as.factor) %>% purrr::map(levels)

回答如何获取长度的问题:

data %>% map(levels) %>% map(length)

1
好的方法。我喜欢它。 - igorkf

4

一个更简单的方法是使用sqldf包并使用select distinct语句。这样可以更轻松地自动获取因子水平的名称,然后将其指定为其他列/变量的水平。

通用的代码片段如下:

library(sqldf)
    array_name = sqldf("select DISTINCT *colname1* as '*column_title*' from *table_name*")

使用鸢尾花数据集的示例代码:

df1 = iris
factor1 <- sqldf("select distinct Species as 'flower_type' from df1")
factor1    ## to print the names of factors

输出:

  flower_type
1      setosa
2  versicolor
3   virginica

1
如果您将每行代码缩进4个空格,它将自动格式化。 - G. Grothendieck

2

如果您想仅显示已声明为as.factor的列的因子水平,可以使用以下代码:

lapply(df[sapply(df, is.factor)], levels)

0
library(dplyr) #for all the following

df$factor %>% unique() %>% str() 

列出并计算特定变量的水平频率

count(df,variable)

返回一个包含特定变量和其频率级别的表格。行数将告知该变量有多少个级别。

count(df,across())

返回一个表格,其中包含所有在观测中共同出现的变量级别以及所有不同组合的频率


0
作为一个长数据框(tibble):
df %>% gather(name, value) %>% count(name, value)

这将所有列转换为名称-值对,然后计算唯一级别。

使用类似以下方式对子集列类型进行筛选:

df %>% select_if(is.character) %>% ...

通过https://stackoverflow.com/a/47122651/3217870获取


0

获取数据框中各级别长度的另一种选择:

data_levels_length <- sapply(seq(1, ncol(data)), function(x){
  length(levels(data[,x]))
})

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