微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建没有某​​些列的对象会修改其他对象

如何解决创建没有某​​些列的对象会修改其他对象

我开始使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?