如何识别 R 数据框中的变量类型?
How do I identify the type of variable in a dataframe in R?
我正在尝试为我的团队创建一个全面的自动化代码,用于使用几种不同的方法进行缺失值插补。我知道逻辑,但我在数据 class 识别方面遇到了麻烦,这对于决定选择哪种方法进行插补很重要。
正在处理的数据如下所示:
现在,我希望我的代码将变量类型标识为:
- Categorical/Factor 多级
- 具有两个级别 1 和 0 的因子(二进制)
- 具有除 1 和 0 之外的两个水平的因子,例如 'yes' 和 'no'
- 连续
这是我的 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())
}
我正在尝试改进我用来使其通用的逻辑,以便其他人可以使用它,但我在这里遇到了困难。感谢任何帮助。
这可以通过检查级别数和级别本身来完成。如果给定 data.frame,categorize
是调用 categorize.data.frame
的泛型。它依次为每一列调用 categorize.default
。 categorize
也可以直接在列上调用
它的工作方式是计算级别数,除非有三个或更多级别,否则它使用 3,如果级别为“0”和“1”则加 2。这给了我们一个介于 0 和 4 之间的数字。然后我们设置一个具有有意义级别名称的因子。
请注意,任何不是因素的内容都将被识别为 "continuous"。例如,正如问题所暗示的,仅包含 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
注意: 由于所要求的几乎只是询问级别数,因此替代方法可能是 return 级别数和使用 -2 表示具有“0”、“1”级别的二进制因子。也就是说,
categorize.default <- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1"))
我正在尝试为我的团队创建一个全面的自动化代码,用于使用几种不同的方法进行缺失值插补。我知道逻辑,但我在数据 class 识别方面遇到了麻烦,这对于决定选择哪种方法进行插补很重要。
正在处理的数据如下所示:
现在,我希望我的代码将变量类型标识为:
- Categorical/Factor 多级
- 具有两个级别 1 和 0 的因子(二进制)
- 具有除 1 和 0 之外的两个水平的因子,例如 'yes' 和 'no'
- 连续
这是我的 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())
}
我正在尝试改进我用来使其通用的逻辑,以便其他人可以使用它,但我在这里遇到了困难。感谢任何帮助。
这可以通过检查级别数和级别本身来完成。如果给定 data.frame,categorize
是调用 categorize.data.frame
的泛型。它依次为每一列调用 categorize.default
。 categorize
也可以直接在列上调用
它的工作方式是计算级别数,除非有三个或更多级别,否则它使用 3,如果级别为“0”和“1”则加 2。这给了我们一个介于 0 和 4 之间的数字。然后我们设置一个具有有意义级别名称的因子。
请注意,任何不是因素的内容都将被识别为 "continuous"。例如,正如问题所暗示的,仅包含 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
注意: 由于所要求的几乎只是询问级别数,因此替代方法可能是 return 级别数和使用 -2 表示具有“0”、“1”级别的二进制因子。也就是说,
categorize.default <- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1"))