R - 基本子集:保留较大数据帧的一些变量

时间:2014-06-11 14:51:36

标签: r variables paste ls subset

我正在学习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]

2 个答案:

答案 0 :(得分:1)

我真的不明白你为什么要在这里使用paste()。此函数通常仅用于连接字符值。

  1. 方法2返回错误,因为paste(data[c(1, 4:7)], sep="")返回c("1", "4", "5", "6", "7")这是一个字符向量,当你用字符向量索引时,R按名称而不是位置查找值,因为没有data.frame中名为“1”或“4”的列,您会收到错误“未定义列已选中”

  2. 方法3对列进行按字母顺序排列,因为ls()按字母顺序排列结果。就像您使用paste一样,这是对ls()的一种非常奇怪的用法。通常,此函数用于列出特定环境中的所有变量和函数。使用它们来提取列名可能不是最佳用途。

  3. 因此,如果您的数据看起来像

    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)