作者BUQ (固执又暴燥)
看板R_Language
标题[问题] data.table setnames 奇怪的现象
时间Thu Dec 7 20:50:11 2017
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
请简略描述你所要做的事情,或是这个程式的目的
[程式范例]:
张贴能够重现错误的程式码,可以帮助版友更快的帮你解决问题
library(magrittr)
library(data.table)
dt1=data.table(type=c('aa','bb','cc'),class=c('01','02','03'),num=c(11,22,33))
dt2=dt1
setnames(dt2,'class','颗颗')
dt1 %>% colnames
dt2 %>% colnames
我在 setnames 改了dt2的colnames
但是 dt1的colnames 也被更改了
这是正常的吗?
[环境叙述]:
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
[关键字]:
选择性,也许未来有用
data.table setnames
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.135.58.147
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1512651014.A.9D4.html
1F:→ clansoda: 应该正常,但是我不知道怎麽解释 12/07 20:58
2F:→ clansoda: 你用copy这个function看看,不要用= 12/07 21:00
3F:→ clansoda: 你这样=像是告诉他这两个是同一个人,只是名字不一样 12/07 21:01
4F:→ clansoda: 不晓得我这样解释是不是正确的,如果有误希望版友更正 12/07 21:01
5F:→ BUQ: 可是用 <- 结果也一样呀 12/07 21:10
6F:→ BUQ: 用copy这个function看看 〈-请问这是什麽意思 12/07 21:11
7F:→ obarisk: 如果你无法理解就不要用data.table 12/07 21:40
8F:→ obarisk: 在data.tablea里是正常,在R不是正常 12/07 21:41
9F:→ celestialgod: data.table的资料是存在指标... 12/07 22:03
10F:→ celestialgod: data.table这个物件只是一个地址 12/07 22:04
11F:→ celestialgod: 你复制一个地址,但是你找到的地方还是同一个 12/07 22:04
12F:→ celestialgod: 所以你改了地址上的一个东西,其实是改地方 12/07 22:04
13F:→ celestialgod: 那最後地址找到的地方还是一样的 12/07 22:04
14F:→ celestialgod: 好像讲得很复杂QQ 12/07 22:04
15F:→ BUQ: 喔喔 了解 很像C语言的指标 谢谢 大大 12/07 22:10
16F:→ BUQ: 刚才试了一下 使用data.frame 後续仍用setnames改 结果一样 12/07 22:15
17F:→ BUQ: 两个都改变了colname 12/07 22:15
18F:→ BUQ: 但 若使用colnames(df2)[2]='颗颗' 则只有df2被改名 12/07 22:18
19F:→ BUQ: 好像 关键是在setnames这个函数 跟是data.table或data.table 12/07 22:19
20F:→ celestialgod: setnames是直接去改地址上的东西 `colnames<-`是 12/07 23:37
21F:→ celestialgod: 复制出来改,所以不会变更到原本的 12/07 23:37
22F:→ celestialgod: 就deep copy跟shadow copy差异吧(?) 12/07 23:37
23F:推 cywhale: data.table这个pkg原生写出来的func都直接去动记忆体位址 12/08 00:41
24F:→ cywhale: 你若不希望改到dt1, dt2 <- copy(dt1) %>% setnames(..) 12/08 00:42
25F:→ obarisk: setnames 是用data.table 的 12/08 08:11
26F:→ obarisk: 不要用,是完全不用library 载入 12/08 08:12
27F:→ BUQ: 就是舍不得 setnames的功能 XD 12/08 10:02
28F:→ BUQ: 谢谢大家 我得到进一步的了解了 也从中看到绕过方法 <(_ _)> 12/08 10:04
29F:推 cywhale: data.table作者Matt Dowle有一篇文章专门讲判断DT是否用 12/08 14:25
31F:→ BUQ: @@ 好喔 谢谢 12/08 19:18
32F:→ obarisk: `names<-` or `colnames<-` or `rownames<-` 12/08 21:58