生成一个虚拟variables

我无法在R中生成以下虚拟variables:

我正在分析年度时间序列数据(时间段1948-2009)。 我有两个问题:

  1. 我如何为观察#10产生一个虚拟variables,即1957年(1957年的值= 1,否则为零)?

  2. 如何在1957年之前生成一个零variables,并将1957年以后的值从1变为2009?

另一个可以更好地工作的方法是如果你有很多variables,就是factormodel.matrix

 > year.f = factor(year) > dummies = model.matrix(~year.f) 

这将包括数据集中每个年份的拦截列(全部为1)和一列,除了一个,这将是“默认”或截距值。

你可以通过改变model.matrix中的model.matrix来改变如何select“默认”。

另外,如果你想省略拦截,你可以放下第一列。

希望这是有用的。

生成这些虚拟variables的最简单方法如下所示:

 > print(year) [1] 1956 1957 1957 1958 1958 1959 > dummy <- as.numeric(year == 1957) > print(dummy) [1] 0 1 1 0 0 0 > dummy2 <- as.numeric(year >= 1957) > print(dummy2) [1] 0 1 1 1 1 1 

更一般地说,您可以使用ifelse根据条件在两个值之间进行select。 所以如果不是一个0-1的虚拟variables,出于某种原因,你想使用4和7,你可以使用ifelse(year == 1957, 4, 7)

使用傻瓜:: dummy() :

 library(dummies) # example data df1 <- data.frame(id = 1:4, year = 1991:1994) df1 <- cbind(df1, dummy(df1$year, sep = "_")) df1 # id year df1_1991 df1_1992 df1_1993 df1_1994 # 1 1 1991 1 0 0 0 # 2 2 1992 0 1 0 0 # 3 3 1993 0 0 1 0 # 4 4 1994 0 0 0 1 

我通常做这种虚拟variables的工作是:

(1)如何为观察#10产生一个虚拟variables,即1957年(1957年值= 1,否则为零)

 data$factor_year_1 <- factor ( with ( data, ifelse ( ( year == 1957 ), 1 , 0 ) ) ) 

(2)如何在1957年之前生成一个零variables,并从1957年开始到2009年取值1?

 data$factor_year_2 <- factor ( with ( data, ifelse ( ( year < 1957 ), 0 , 1 ) ) ) 

那么,我可以在我的模型中引入这个因子作为一个虚拟variables。 例如,要看y是否有长期趋势:

 summary ( lm ( y ~ t, data = data ) ) 

希望这可以帮助!

软件包mlr包含createDummyFeatures用于此目的:

 library(mlr) df <- data.frame(var = sample(c("A", "B", "C"), 10, replace = TRUE)) df # var # 1 B # 2 A # 3 C # 4 B # 5 C # 6 A # 7 C # 8 A # 9 B # 10 C createDummyFeatures(df, cols = "var") # var.A var.B var.C # 1 0 1 0 # 2 1 0 0 # 3 0 0 1 # 4 0 1 0 # 5 0 0 1 # 6 1 0 0 # 7 0 0 1 # 8 1 0 0 # 9 0 1 0 # 10 0 0 1 

createDummyFeatures会丢弃原始variables。 https://www.rdocumentation.org/packages/mlr/versions/2.9/topics/createDummyFeatures

我在kaggle论坛上读到这个:

 #Generate example dataframe with character column example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F")) names(example) <- "strcol" #For every unique value in the string column, create a new 1/0 column #This is what Factors do "under-the-hood" automatically when passed to function requiring numeric data for(level in unique(example$strcol)){ example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level, 1, 0) } 

如果您想获得K个虚拟variables,而不是K-1,请尝试:

 dummies = table(1:length(year),as.factor(year)) 

最好,

ifelse函数对于这样的简单逻辑来说是最好的。

 > x <- seq(1950, 1960, 1) ifelse(x == 1957, 1, 0) ifelse(x <= 1957, 1, 0) > [1] 0 0 0 0 0 0 0 1 0 0 0 > [1] 1 1 1 1 1 1 1 1 0 0 0 

另外,如果你想要它返回字符数据,那么你可以这样做。

 > x <- seq(1950, 1960, 1) ifelse(x == 1957, "foo", "bar") ifelse(x <= 1957, "foo", "bar") > [1] "bar" "bar" "bar" "bar" "bar" "bar" "bar" "foo" "bar" "bar" "bar" > [1] "foo" "foo" "foo" "foo" "foo" "foo" "foo" "foo" "bar" "bar" "bar" 

分类variables与嵌套…

 > x <- seq(1950, 1960, 1) ifelse(x == 1957, "foo", ifelse(x == 1958, "bar","baz")) > [1] "baz" "baz" "baz" "baz" "baz" "baz" "baz" "foo" "bar" "baz" "baz" 

这是最直接的select。

我使用这样一个函数(data.table):

 # Ta funkcja dla obiektu data.table i zmiennej var.name typu factor tworzy dummy variables o nazwach "var.name: (level1)" factorToDummy <- function(dtable, var.name){ stopifnot(is.data.table(dtable)) stopifnot(var.name %in% names(dtable)) stopifnot(is.factor(dtable[, get(var.name)])) dtable[, paste0(var.name,": ",levels(get(var.name)))] -> new.names dtable[, (new.names) := transpose(lapply(get(var.name), FUN = function(x){x == levels(get(var.name))})) ] cat(paste("\nDodano zmienne dummy: ", paste0(new.names, collapse = ", "))) } 

用法:

 data <- data.table(data) data[, x:= droplevels(x)] factorToDummy(data, "x") 

另一种方法是使用qdapTools包中的qdapTools ,即

 df <- data.frame(var = sample(c("A", "B", "C"), 5, replace = TRUE)) var #1 C #2 A #3 C #4 B #5 B library(qdapTools) mtabulate(df$var) 

这使,

  ABC 1 0 0 1 2 1 0 0 3 0 0 1 4 0 1 0 5 0 1 0 

您好,我写这个通用函数来生成一个虚拟variables,基本上复制Stata中的replace函数。

如果x是数据框是x,并且我想要一个名为a的虚拟variables,当x$b取值为c时,它将取值1

 introducedummy<-function(x,a,b,c){ g<-c(a,b,c) n<-nrow(x) newcol<-g[1] p<-colnames(x) p2<-c(p,newcol) new1<-numeric(n) state<-x[,g[2]] interest<-g[3] for(i in 1:n){ if(state[i]==interest){ new1[i]=1 } else{ new1[i]=0 } } x$added<-new1 colnames(x)<-p2 x }