as_tibble仅返回单个变量

时间:2019-05-13 00:56:46

标签: r dplyr

我对R和编码非常陌生,这是我第一次接触SO

我有一个数据帧(brfss2013),其中包含491775 obs和330个变量。我想使用其中三个变量($ qlmentl2,$ misdeprd和$ misnowork),并仅用这三个变量创建一个名为“ level_unhappy”的新数据框。

我已经在R Studio中尝试过此代码,结果是一个数据帧带有491775 obs(正确)和1个变量。

```{r create_level_unhappy, results='hide'}
level_unhappy <-  as_tibble(brfss2013$qlmentl2, brfss2013$misdeprd, brfss2013$misnowork, validate = FALSE)

```

我也尝试过...

level_unhappy <- as.data.frame(brfss2013$qlmentl2, brfss2013$misdeprd, brfss2013$misnowork) 

...并收到...

Error in !optional : invalid argument type
In addition: Warning message:
In as.data.frame.integer(brfss2013$qlmentl2, brfss2013$misdeprd,  :
  'row.names' is not a character vector of length 491775 -- omitting it. Will be an error!

我想念什么?

干杯,  -eric

2 个答案:

答案 0 :(得分:2)

as.data.frame的第一个参数必须是您希望连接到数据帧中的对象的列表,因为第二个参数正在寻找row.names。因此,为了避免混淆R认为您的第二个数据帧是row.names,并且由于您想加入 vector ,请将它们全部放入cbind()

level_unhappy <- as.data.frame(cbind(brfss2013$qlmentl2, brfss2013$misdeprd, brfss2013$misnowork))

您还可以通过使用R的其他基本命令data.frame而不是as.data.frame来避免此麻烦,根据您要执行的操作,它提供了一些间接优势。但是,在这种情况下,您的代码将按data.frame编写:

level_unhappy <- data.frame(brfss2013$qlmentl2, brfss2013$misdeprd, brfss2013$misnowork)

data.frame不假定任何参数是要组合的数据以外的任何东西,例如,您使用诸如row.names = "r1"之类的可选参数调用对数据进行了尽可能多的阐述。

答案 1 :(得分:1)

as_tibble将根据您作为第一个参数传递的内容执行不同的操作。通过执行as_tibble(brfss2013$qlmentl2, ...),您将传递一个向量作为第一个参数。向量的as_tibble方法未设置为接受多个向量,并且您传递的其他向量最终被用作行名等。相反,我认为您想要这样做:

as_tibble(bfrss2013[, c("qlmentl2","misdeprd","misnowork")]) 

这样,您将传递数据框作为第一个参数。 as_tibble会将数据帧转换为tibble

这仅在确实要将数据转换为tibble的情况下才适用。标题大多像数据帧一样工作,并具有几个附加功能。如果您要做的只是将这些列分离为一个单独的变量,则可以执行以下操作:

new_df <- bfrss2013[, c("qlmentl2","misdeprd","misnowork")]