【问题标题】:R - basic subsetting: keeping some variables of a larger data frameR - 基本子集:保留较大数据框的一些变量
【发布时间】:2014-06-11 14:51:36
【问题描述】:

我正在学习 R 的基础知识,并想了解该语言在特定情况下所做的基本假设。

核心问题: 1. 为什么下面的方法2会返回错误? 2. 为什么下面的方法 3 按字母顺序排列变量?

在具有以下变量的数据框“数据”中

Zeta    Alpha    Gamma    Delta    Sum    Mean    Corr

我正在尝试对变量“Zeta”、“Delta”、“Sum”、“Mean”和“Corr”进行子集化。

“方法一”(成功):

> 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

我认为这与将值粘贴到字符的事实有关,但我不清楚这将如何影响函数。

“方法 3”(有效,但按字母顺序排列输出):

> myvars <- paste(ls(data[1, 4:7]), sep = "")
> newdata <- data[myvars]

【问题讨论】:

  • @user2926101 这有帮助 - 谢谢。但我重组了 Q 来解释我的实际意思。
  • 你有以下向量吗? data &lt;- c('Zeta', 'Alpha', 'Gamma', 'Delta', 'Sum', 'Mean', 'Corr') 如果您有一个数据框并且只是提供变量的名称,请考虑添加示例数据。
  • 我不确定您期望方法 2 做什么。只需运行paste(data[c(1,4:7)], sep="") 以查看它返回的内容以及它为什么不起作用。为什么不直接做data[c("Zeta", "Delta", "Sum", "Mean", "Corr")]
  • 以此为例。我可以制作那个向量,但我打算使用有很多很多变量的集合。我希望 R 阅读它们,而不是输入所有它们。

标签: r variables subset paste


【解决方案1】:

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

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

  2. 方法 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]

【讨论】:

  • 非常好 - 谢谢。我刚刚使用 myvars
  • 回复:为什么要粘贴 - 互联网告诉我:statmethods.net/management/subset.html
  • @toandthrough 我使用了名称,因为pastels 搞得一团糟,我认为您真的想按列名而不是数字索引来索引。使用data[c(1, 4:7)] 就好了。在该链接上使用paste 是出于非常不同的目的。他们想要列“V1”、“V2”和“V3”,但他们没有输入它们,而是使用paste("V", 1:3", sep="") 来生成名称向量。
  • 如果您想了解更多有关 R 工作原理的信息,我建议您在不使用 &lt;- 的情况下输入 paste("v", 1:3, sep="")paste(data[c(1,4:7)], sep="") 之类的内容,以查看 R 正在做什么。
【解决方案2】:

我会避免使用列索引。如果您的数据发生更改或列重新排列,您的代码可能会中断。

myvars <- c("Zeta", "Delta", "Sum", "Mean", "Corr")
newdata <- data[, myvars]

或者你可以使用dplyr:

newdata <- select(data, Zeta, Delta, Sum, Mean, Corr)

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2016-03-29
    • 2014-06-25
    • 1970-01-01
    • 2018-11-26
    • 2019-09-06
    • 2015-08-31
    • 2023-04-08
    相关资源
    最近更新 更多