我正在学习R的基础知识,并希望了解语言在特定情况下所做的基本假设。
核心问题: 1.为什么下面的方法2会返回错误? 2.为什么下面的方法3按字母顺序排列变量?
在具有以下变量的数据框“data”中
Zeta Alpha Gamma Delta Sum Mean Corr
我正在尝试将变量“Zeta”,“Delta”,“Sum”,“Mean”和“Corr”进行子集化。
“方法1”(成功):
> newdata <- data[c(1, 4:7)]
“方法2”(错误):
> myvars <- paste(data[c(1, 4:7)], sep="")
> newdata <- data[myvars]
Error in `[.data.frame`(data, myvars) : undefined columns selected
我认为这与粘贴强制字符值的事实有关,但我不清楚它会如何影响函数。
“METHOD 3”(有效,但按字母顺序输出):
> myvars <- paste(ls(data[1, 4:7]), sep = "")
> newdata <- data[myvars]
答案 0 :(得分:1)
我真的不明白你为什么要在这里使用paste()
。此函数通常仅用于连接字符值。
方法2返回错误,因为paste(data[c(1, 4:7)], sep="")
返回c("1", "4", "5", "6", "7")
这是一个字符向量,当你用字符向量索引时,R按名称而不是位置查找值,因为没有data.frame中名为“1”或“4”的列,您会收到错误“未定义列已选中”
方法3对列进行按字母顺序排列,因为ls()
按字母顺序排列结果。就像您使用paste
一样,这是对ls()
的一种非常奇怪的用法。通常,此函数用于列出特定环境中的所有变量和函数。使用它们来提取列名可能不是最佳用途。
因此,如果您的数据看起来像
data <- data.frame(Zeta=1, Alpha=2, Gamma=3,
Delta=4, Sum=5, Mean=6, Corr=7)
然后更常用的方法是获取数据
myvars <- names(data)[c(1, 4:7)]
data[myvars]
答案 1 :(得分:0)
我会避免使用列索引。如果您的数据发生变化或列重新排列,则代码可能会中断。
myvars <- c("Zeta", "Delta", "Sum", "Mean", "Corr")
newdata <- data[, myvars]
或者您可以使用dplyr
:
newdata <- select(data, Zeta, Delta, Sum, Mean, Corr)