【发布时间】:2012-03-14 13:48:17
【问题描述】:
问题:
我经常需要从 R 中的 data.frame 中选择一组变量。 我的研究是社会和行为科学,拥有一个包含数百个变量的数据框架是很常见的(例如,会有一系列调查问题、人口统计项目、绩效指标等的项目级别信息.等)。
作为分析的一部分,我经常想要选择一个变量子集。 例如,我可能想得到:
- 一组变量的描述性统计
- 一组变量的相关矩阵
- 对一组变量进行因子分析
- 线性模型中的预测变量
现在,我知道有很多方法可以编写代码来选择变量子集。 Quick-r has a nice overview of common ways of extracting variable subsets from a data.frame.
例如,
myvars <- c("v1", "v2", "v3")
newdata <- mydata[myvars]
不过,我对这个过程的效率很感兴趣,尤其是当您可能需要从 data.frame 中提取 20 个左右的变量时。变量的命名约定通常不直观,尤其是在您从其他人那里继承数据集的情况下,因此您可能会想知道,变量是 Gender、gender、sex、GENDER、@987654329 @, 等等。
将其乘以需要提取的 20 个变量,记住变量名称的任务变得比实际需要的复杂。
具体例子
为了使下面的讨论具体化,我将使用psych 包中的bfi data.frame。
library(psych)
data(bfi)
df <- bfi
head(df, 1)
A1 A2 A3 A4 A5 C1 C2 C3 C4 C5 E1 E2 E3 E4 E5 N1 N2 N3 N4 N5 O1 O2 O3 O4
61617 2 4 3 4 4 2 3 3 4 4 3 3 3 4 4 3 4 2 2 3 3 6 3 4
O5 gender education age
61617 3 1 NA 16
- 如何有效地选择任意变量集,具体而言,我将选择
A1, A2, A3, A5, C2, C3, C5, E2, E3, gender, education, age?
我目前的策略
我目前有一系列我使用的策略。
当然,有时我可以利用变量的数字位置或命名约定之类的东西,并使用grep 来选择或paste 来构造。但有时我需要一个更通用的解决方案。我一直在使用以下内容:
1。名称(df)
在早期,我曾经调用names(df),复制引用的变量名,然后编辑直到我想要的。
2。使用数据库
有时我会有一个单独的 data.frame 将每个变量存储为一行,并有变量名称、变量标签的列,并且它有一列指示是否应为特定分析保留变量。然后我可以过滤该include 变量并提取变量名称向量。我发现这在我开发心理测试以及想要包含或排除某些项目的各种迭代时特别有用。
3。输入(名称(df))
作为Hadley Wickham once pointed out to medput是一个不错的选择;例如,dput(names(df)) 比 names(df) 更好,因为它输出的列表已经是 c("var1", "var2", ...) 格式:
dput(names(df))
c("A1", "A2", "A3", "A4", "A5", "C1", "C2", "C3", "C4", "C5",
"E1", "E2", "E3", "E4", "E5", "N1", "N2", "N3", "N4", "N5", "O1",
"O2", "O3", "O4", "O5", "gender", "education", "age")
然后可以将其复制到脚本中并进行编辑。
但是能不能更高效
我猜dput 是一个相当不错的变量选择策略。该过程的效率很大程度上取决于您将文本复制到脚本中然后将名称列表编辑成所需的名称的熟练程度。
但是,我仍然记得基于 GUI 的变量选择系统的效率。
例如,在 SPSS 中,当您与对话框交互时,您可以用鼠标指向并单击数据集中所需的变量。您可以按住 shift 单击选择一系列变量,您可以按住 shift 并按下向下键选择一个或多个变量,依此类推。然后您可以按Paste,将提取变量名称的命令粘贴到您的脚本编辑器中。
所以,最后是核心问题
- 是否有一个简单的 GUI 设备允许从 data.frame 中选择变量(例如,
guiselect(df)之类的东西打开一个用于变量选择的 gui 窗口),并返回一个选定的变量名称向量c("var1", "var2", ...)? -
dput是在 R 中选择一组变量名称的最佳通用选项吗?还是有更好的方法?
更新(2017 年 4 月):我发布了自己对 good strategy below 的理解。
【问题讨论】:
-
如果您使用 Office 在 Windows 上工作,一个选项是使用
write.csv()将您的 data.frame 保存到 csv 文件,用 Excel 打开它,删除不需要的列,保存,然后使用read.csv()将其读回R。我希望人们提出更好的解决方案... -
edit(df),不要的删掉?
-
@blindJesse 我很少想在这些上下文中实际修改 data.frame。在一组典型的分析中,我将为不同的分析提取 20 或 30 个不同的变量子集。对我来说,任何更改都记录在我的脚本中也很重要,这样结果是可重现的。
-
我喜欢这个问题!我一直在忍受输入名称(甚至不知道 dput 的事情)。我什至从未想过会有一种 R 风格的方法。
-
@JeromyAnglim。你现在是如何处理这个问题的?现在是 2017 年,我仍然需要在 R 中的
regsubsets( )中输入var1 + var2 + var3 + .... var158。我仍然认为在 JMP 和 SPSS 中进行此类分析更容易。
标签: r