我有一个大型数据集,我想阅读特定列或删除所有其他列.
data <- read.dta("file.dta")
Run Code Online (Sandbox Code Playgroud)
我选择了我不感兴趣的列:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
Run Code Online (Sandbox Code Playgroud)
而且我想做的事情如下:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
Run Code Online (Sandbox Code Playgroud)
删除所有不需要的列.这是最佳解决方案吗?
有谁知道如何从R中的data.frame中删除整个列?例如,如果给我这个data.frame:
> head(data)
chr genome region
1 chr1 hg19_refGene CDS
2 chr1 hg19_refGene exon
3 chr1 hg19_refGene CDS
4 chr1 hg19_refGene exon
5 chr1 hg19_refGene CDS
6 chr1 hg19_refGene exon
Run Code Online (Sandbox Code Playgroud)
我想删除第二列.
为了摆脱a中名为"foo"的列data.frame,我可以这样做:
df <- df[-grep('foo', colnames(df))]
但是,一旦df转换为data.table对象,就无法删除列.
例:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
Run Code Online (Sandbox Code Playgroud)
但是一旦它被转换为一个data.table对象,这就不再适用了.
可能重复:
删除列R数据框
假设我有一个包含c1,c2,c3列的数据框.
我想列出c1和c2.我怎么做?
我试过了:
head(data[column!="c3"])
head(data)[,2]
head(data[!"c3"])
Run Code Online (Sandbox Code Playgroud) 例如,使用数据集 mtcars
mtcars[ , "cyl"]
Run Code Online (Sandbox Code Playgroud)
和
mtcars[ , 2]
Run Code Online (Sandbox Code Playgroud)
两个都给我相同的专栏.所以,既然我可以得到一切,但第2列是这样的:
mtcars[ , -2]
Run Code Online (Sandbox Code Playgroud)
我不指望这个:
mtcars[ , -"cyl"]
Error in -"cyl" : invalid argument to unary operator
Run Code Online (Sandbox Code Playgroud)
相反,我能想到的最好的是:
mtcars[ , !colnames(mtcars)=="cyl"]
Run Code Online (Sandbox Code Playgroud)
有更简单的解决方案吗?
编辑:似乎合乎逻辑的是,如果前两种技术有效,那么后两种技术也应该如此.我希望我遗失了一些东西.帮助页面?"["或?subset不解释这种违反直觉的结果.有谁知道这是为什么?
许多讨论R的非标准评价,功能例如with,subset和transform含有这样的警告:
对于交互式使用,这是非常有效且易于阅读的。然而,对于编程,即在一个函数中,需要更加小心,通常应该避免使用
with(),因为例如,数据中的变量可能会意外覆盖局部变量,请参阅参考资料。
(引用自 的文档with,其他内容的信息量较少)
“参考”是这篇 2003 年的文章。坦率地说,我没有看到它的相关性。它在第 6 节中提到了关于“数据中的变量可能会意外覆盖局部变量”这一点,但它只是这样做 - 提及它。据我所知,该文章中没有任何内容告诉您警告告诉您检查参考资料尚未告诉您的任何内容。
我已经搜索了 R 手册,甚至在 3500 页的参考索引中搜索了术语“非标准”,但除了我已经提到的内容之外,我什么也没想到。我真的认为它会在语言定义中,但我已经阅读了整篇文章并没有找到它。我得到的最接近的是涵盖substitutefunction的部分,我碰巧知道许多具有非标准评估的函数都依赖于此。
至于我确信找不到帮助的任何其他地方,我已经从头到尾阅读了 R 常见问题解答和R 简介。将R常见问题提到eval和substitute时代屈指可数,但不以任何方式与此有关。唯一值得注意的部分是here,它也建议检查 的文档deriv,但我发现那里没有任何用处。
那么,R 是否有任何官方部分实际上记录了非标准评估的危险?我觉得很奇怪,R 的部分文档会告诉我要小心处理某些事情,而没有提供任何告诉我如何去做的地方。不可否认,需要照顾。例如,高级 R 显示了具有非标准评估的函数可能导致问题的几种方式。我之前已经为这种粗心付出了代价,不难找到带有关于非标准评估警告的评论的优秀答案。
可能重复:
删除列R数据框
假设,我有以下数据帧,并希望删除列"dataB"什么是R命令?
y <- data.frame(k1=c(101,102,103,104,105,106,107,108),
B=c(11,12,13,NA,NA,16,17,18),
dataB=11:18)
Run Code Online (Sandbox Code Playgroud) 作为subset()手册说明:
警告:这是一个便于交互使用的便利功能
我从中学到这篇大文章,不仅这样的警告背后的秘密,但有很好的理解substitute(),match.call(),eval(),quote(), call,promise以及其他相关的研究课题,是一个有点复杂.
现在我明白上面的警告是什么了.一个超级简单的实现subset()可能如下:
subset = function(x, condition) x[eval(substitute(condition), envir=x),]
Run Code Online (Sandbox Code Playgroud)
虽然subset(mtcars, cyl==4)收益中的行表mtcars满足cyl==4,包围subset()在另一个函数失败:
sub = function(x, condition) subset(x, condition)
sub(mtcars, cyl == 4)
# Error in eval(expr, envir, enclos) : object 'cyl' not found
Run Code Online (Sandbox Code Playgroud)
使用原始版本subset()也会产生完全相同的错误条件.这是由于的限制substitute()-eval()对:它正常工作,而condition为cyl==4,但是当condition通过包络函数传递sub()的condition的参数subset()将不再cyl==4,但嵌套condition …
我不知道为什么我的“开始”pred 不能工作。我只是在 pd.to_datetime 上添加了一些编辑,但没有任何效果。我很困惑如何解决这个问题。这是我的代码
pred = results.get_prediction(start=pd.to_datetime('2018-06-01'), dynamic=False)
pred_ci = pred.conf_int()
ax = y['2015':].plot(label='observed')
pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7, figsize=(14, 4))
ax.fill_between(pred_ci.index,
pred_ci.iloc[:, 0],
pred_ci.iloc[:, 1], color='k', alpha=.2)
ax.set_xlabel('Date')
ax.set_ylabel('Retail_sold')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
并且我的错误日志总是参考我的时间格式,我不得不重新采样我的数据,从每日数据到每月数据,然后再开始数据分析和解决数据,但我不知道为什么我的数据不能使用 pd.todatetime 读取。
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
pandas/_libs/index.pyx in pandas._libs.index.DatetimeEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
KeyError: 1546300800000000000
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2896 try:
-> 2897 return self._engine.get_loc(key) …Run Code Online (Sandbox Code Playgroud) 我正在使用内存为8 GB的Windows 8操作系统.我有一个180万行x 270列的data.frame ,我必须执行glm.(logit /任何其他分类)
我尝试使用ff和bigglm包来处理数据.
但我仍然面临错误" Error: cannot allocate vector of size 81.5 Gb" 的问题.因此,我将行数减少到10,并在类ffdf的对象上尝试了bigglm的步骤.但是错误仍然存在.
任何人都可以建议我用这么多行和列构建分类模型这个问题的解决方案吗?
**EDITS**:
我在运行代码时没有使用任何其他程序.在运行代码之前系统上的RAM是60%免费的,这是因为R程序.当我终止R时,RAM 80%免费.
我正在根据评论者的建议添加一些我正在使用的专栏进行复制. OPEN_FLG是DV,其他是IDV
str(x[1:10,])
'data.frame': 10 obs. of 270 variables:
$ OPEN_FLG : Factor w/ 2 levels "N","Y": 1 1 1 1 1 1 1 1 1 1
$ new_list_id : Factor w/ 9 levels "0","3","5","6",..: 1 1 1 1 1 1 1 1 1 …Run Code Online (Sandbox Code Playgroud)