我对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
答案 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")]