如何解决创建没有某些列的对象会修改其他对象
我开始使用r-studio和data.table来学习r,因此很抱歉提出这个基本要求。这就是我所拥有的(在r-markdown上工作):
对象1:
ps.data <- fread("database.csv")
我正在尝试创建一个与“ ps.data”相同的对象,但同时删除了“ database.csv”具有的5列,但是却更改了“ ps.data”。到目前为止,我已经尝试过:
首次尝试:有效,但效率极低。
ps.data2<-ps.data[,"col1":=NULL]
ps.data3<-ps.data2[,"col2":=NULL]
...
ps.data6<-ps.data5[,"col5":=NULL]
然后删除我不需要的所有对象。
第二种尝试:即使它创建的对象没有删除列,但问题是现在我打开“ ps.data”,并且代码也删除了该列中的列。
ps.data2<- ps.data[,c("col1","col2","col3","col4","col5"):=NULL]
解决方法
编辑:我本来是完全错误的。这是使用data.table::copy
命令强制data.table复制数据,而不是仅仅引用它的解决方案。
ps.data2<- copy(ps.data)
ps.data2[,c("col1","col2","col3","col4","col5"):=NULL]
原因如下: Understanding exactly when a data.table is a reference to (vs a copy of) another data.table
基本上,当您放置ps.data2<-ps.data
时,data.table只是创建对原始数据的引用。看起来是关于何时通过引用创建或实际复制事物的更复杂的讨论,但请查看上面的链接。
我开始喜欢这个,我正在考虑通过消除不需要的列来创建对象,从这个意义上讲,我没有遇到直接的解决方案,而是通过更改问题的逻辑并通过以下方式创建对象保留所需的列而不是删除其他列会很好。
ps.data2 <- ps.data[,.(col6,col7,col8,col9,col10,col11,col12,col13)]
编辑:忘记了解释。在这里。
* 我的老师说:
符号:=
始终引用列的创建(或消除),因此每次使用它都会更改您的初始数据库。但是,使用此解决方案,您无需修改ps.data
,而是要创建一个包含指定列(或变量)的对象...
希望它有用
您可以使用列表和%in%
运算符
%in%
运算符返回TRUE / FALSE索引,其中与我们的列表匹配的列名称为TRUE,而不匹配的列名称为FALSE。
为了解决这个问题,我们使用!
来否定此列表,给我们一个索引,该索引对于不在列表中的名称为TRUE,对于为我们的名称为FALSE。
然后您可以使用它来对数据进行子集并将其分配给ps.data2
示例:
ps.data <- fread("database.csv")
ps.data2 <- ps.data[,!(names(ps.data) %in% c("col1","col5")]
mtcars示例:
df <- mtcars
df <- df[,!(names(df) %in% c("mpg","cyl"))]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。