【问题标题】:How do I identify the type of variable in a dataframe in R?如何识别 R 中数据框中的变量类型?
【发布时间】:2017-02-02 23:01:07
【问题描述】:

我正在尝试为我的团队创建一个全面的自动化代码,以使用几种不同的方法进行缺失值插补。我知道逻辑,但我在数据类识别方面遇到了麻烦,这对于决定选择哪种方法进行插补很重要。

正在处理的数据如下所示:

现在,我希望我的代码将变量类型识别为:

  1. 具有多个级别的分类/因子
  2. 具有两个级别 1 和 0(二进制)的因子
  3. 除 1 和 0 外有两个级别的因子,例如“是”和“否”
  4. 连续

这是我拥有的 WIP 代码,但它不能很好地完成工作,我知道如果数据不同,逻辑将会失败

data_type_vector<-function(x)
{
  categorical_index<-character()
  binary_index<-character()
  continuous_index<-character()
  binary_index_1<-character()

  data<-x

  for(a in 1:ncol(data)){

if(length(unique(data[,a])) >= 2 & length(unique(data[,a])) < 15 & 
   max(as.character(data[,a]),na.rm=T) != 1 & min(as.character(data[,a]),na.rm=T) !=0)
{

  categorical_index<-c(categorical_index,colnames(data[a]))

} else if (max(as.character(data[,a]),na.rm=T) == 1 & min(as.character(data[,a],na.rm=T))==0) {

  binary_index<-c(binary_index,colnames(data[a]))

} else if (length(unique(data[,a]))==2) {

  #this basically defines categorical variables with two categories like male/female
  #which don't have 1 0 values in the data but are still binary
  #we are keeping them seperate for the purpose of further analysis

  binary_index_1<-c(binary_index_1,colnames(data[a]))

} else

{
  continuous_index<-c(continuous_index,colnames(data[a]))
}

}

assign("categorical_index",categorical_index,envir=globalenv())
assign("binary_index",binary_index,envir=globalenv())
assign("continuous_index",continuous_index,envir=globalenv())
assign("binary_index_1",binary_index_1,envir=globalenv())
}

我正在尝试改进我用来使其通用的逻辑,以便其他人可以使用它,但我在这里碰壁了。感谢任何帮助。

【问题讨论】:

  • 你可以只使用class()和/或str()以及一些简单的控制流语句
  • @Hack-R 它不像我想要的结果那样工作。
  • 图片不是代码/数据。它们用于图表。
  • 请参阅minimal reproducible example,了解如何将可重现的示例发布到 SO。
  • @G.Grothendieck 我会记住这一点,谢谢!

标签: r dataframe imputation


【解决方案1】:

这可以通过检查级别的数量和级别本身来完成。 categorize 是调用 categorize.data.frame 如果给定 data.frame 的泛型。它反过来为每一列调用categorize.defaultcategorize也可以直接在列上调用。

它的工作方式是计算级别的数量,除非有 3 个或更多,它使用 3,如果级别为“0”和“1”,则添加 2。这给了我们一个介于 0 和 4 之间的数字。然后我们使用有意义的级别名称设置一个因子。

请注意,任何不是因素的内容都将被标识为“连续”。例如,正如问题所暗示的那样,仅包含 0 和 1 的列是连续的,因为它不是一个因素。

categorize <- function(x, ...) UseMethod("categorize")

categorize.data.frame <- function(x, ...) sapply(x, categorize)

categorize.default <- function(x, ...) {
   factor(min(nlevels(x), 3) + 2*identical(levels(x), c("0", "1")), levels = 0:4, 
    labels = c("continuous", "factor1", "factor2", "factor", "zero-one"))
}

现在测试一下:

DF <- data.frame(a = factor(c(0, 1, 0)), b = factor(c("male", "female", "male")), 
         c = factor(1:3), d = 1:3)

categorize(DF)
##          a          b          c          d 
##   zero-one    factor2     factor continuous 
## Levels: continuous factor1 factor2 factor zero-one

categorize(DF$a)
## [1] zero-one
## Levels: continuous factor1 factor2 factor zero-one

categorize(0:1)
## [1] continuous
## Levels: continuous factor1 factor2 factor zero-one

注意:由于所要求的内容接近于仅要求级别数,因此另一种方法可能是仅返回级别数并使用 -2 来表示具有“0”、“1”级。也就是说,

categorize.default <- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1"))

【讨论】:

  • 这是一个非常好的解释,而且完全有道理。所以,如果我使用 categorize.default &lt;- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1")) 这些值和含义: -2 : Binary(0 and 1),0 : Continuous,1 : factor1,2 : factor2,>=3 : 多级因子。我说的对吗?
  • 如果 n 是您评论中公式的值,则 n = 2 表示 2 个级别,n = 3 表示 3 个级别,n = 4 个级别等。如果需要 3,请使用 min(nlevels(x), 3) - 4 * identical(levels(x), c("0", "1"))意思是 3 级或更多级别,但我不太确定像这样在 3 级切断它是否真的有任何优势。
  • 有道理,非常感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2016-08-25
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多