通过.Rmd

时间:2017-12-26 10:10:46

标签: r rstudio knitr

我刚注意到在dummies中编织时,.Rmd包中的一个非常奇怪的行为。这是可重复的例子。

---
title: "Dummies Package Behavior"
author: "Kim"
date: '`r Sys.Date()`'
output:
  pdf_document:
    toc: yes
    toc_depth: '3'
---

Load the libraries

```{r}
library(tidyverse)
library(dummies)
```

Main data wrangling

```{r}
df <- data_frame(year = c(2016, 2017, 2018))
temp <- dummy(df$year)
temp <- as_data_frame(temp)
df <- bind_cols(df, temp)
```

View output

```{r}
df
```

当我查看df时,我期待看到的是year2016year2017year2018的0-1列,这是正常行为对于dummies包。

当您在RStudio中编织此R Markdown文档时,它会显示以下内容:C:/Users/Kim/Desktop/dummies.Rmd2016C:/Users/Kim/Desktop/dummies.Rmd2017C:/Users/Kim/Desktop/dummies.Rmd2018。也就是说,它使用整个文档地址来制作列名。

我不明白为什么会出现这种行为。显然,我想将列名称设为year2016year2017year2018

2 个答案:

答案 0 :(得分:2)

该问题与dplyr无关,因为我们可以使用data.frame()重现该问题。显然,当作为R Markdown文档的一部分执行时,在dummy()函数中分配列标签存在问题。正如Luke的回答所述,一种解决方法是使用dummy.data.frame()。另一种方法是使用colnames()函数在将年份和虚拟变量绑定到cbind()之后重命名列,这也启用基于dplyr的解决方案。

这应该作为dummies包的错误报告提交。

---
title: "Behavior of dummies package"
author: "anAuthor"
date: "12/26/2017"
output:
  html_document: default
  pdf_document: default
  word_document: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# first, reproduce error with data.frame()

```{r}
library(dummies)
df <- data.frame(year = c(2016, 2017, 2018))
df
dummyCols <- dummy(df$year)
dummyCols <- as.data.frame(dummyCols)
dummyCols
```

# data.frame() approach to fix the error

```{r}
df <- data.frame(year = c(2016, 2017, 2018))
df
dummyCols <- dummy.data.frame(data=df,dummy.classes="ALL")
dummyCols
df <- cbind(df, dummyCols)
df
```

...和输出,首先再现错误。

enter image description here

...第二,使用dummies.data.frame()来避免错误。

enter image description here

dplyr更正的工作原理如下。

# dplyr approach 

```{r}
library(tidyverse)
df <- data_frame(year = c(2016, 2017, 2018))
temp <- dummy(df$year)
temp <- as_data_frame(temp)
df <- bind_cols(df, temp)
colnames(df) <- c("year",unlist(lapply(2016:2018,function(x) {
     paste("year",x,sep="")
})))
df
```

enter image description here

答案 1 :(得分:1)

我不确定为什么会发生这种互动,但这种轻微的修改似乎绕过它:

```{r}
df <- data.frame(year = c(2016, 2017, 2018))
df <- data.frame(df, dummy.data.frame(data = df, dummy.classes = "ALL"))
```

enter image description here

请注意,来自基数的data.frame而不是来自data_frame的{​​{1}}似乎有所不同。