在这个问题中,data.table包创建者解释了为什么行不能通过引用在中间插入(或删除)data.table.他还指出,这种操作可以在表格末尾进行.你能展示一个代码来完成这个动作吗?它将是"参考"版本
a<- data.table(id=letters[1:2], var=1:2)
> a
id var
1: a 1
2: b 2
> rbind(a, data.table(id="c", var=3))
id var
1: a 1
2: b 2
3: c 3
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:
既然不可能采用适当的解决方案,那么从速度和内存使用情况来看,下列哪一项更好(如果内部不同,不确定)?
rbind(a, data.table(id="c", var=3))
rbindlist(list(a, data.table(id="c", var=3)))
Run Code Online (Sandbox Code Playgroud)
最终还有其他(更好)的方法吗?
我有以下列表,我想在每组ID之前添加一个新行,保留ID并将A和B设置为1.00.
ID DATEE A B
102984 2016-11-23 2.0 2.0
140349 2016-11-23 1.5 1.5
167109 2017-04-16 2.0 2.0
167109 2017-06-21 1.5 1.5
Run Code Online (Sandbox Code Playgroud)
最终结果:
ID DATEE A B
102984 NA 1.0 1.0
102984 2016-11-23 2.0 2.0
140349 NA 1.0 1.0
140349 2016-11-23 1.5 1.5
167109 NA 1.0 1.0
167109 2017-04-16 2.0 2.0
167109 2017-06-21 1.5 1.5
Run Code Online (Sandbox Code Playgroud)
到目前为止,我使用了以下代码,在每个组的底部添加一个空行do.call(rbind,by(df,df $ ID,rbind,""))但是我无法在其中引入特定值当我用值向量代替""时各自的列.
在修改数据框中的一个条目时,R似乎复制整个数据帧.我想知道是否有办法让R只复制相应的数据列(例如下面的特定INTSXP而不是VECSXP)来维护复制变更策略?还有办法对数据帧进行现场修改吗?
> x<-data.frame(x=1:1000000,y=1:1000000)
> .Internal(inspect(x))
@62cd2b0 19 VECSXP g0c2 [OBJ,MARK,NAM(2),ATT] (len=2, tl=0)
@f80d0e0 13 INTSXP g0c7 [MARK] (len=1000000, tl=0) 1,2,3,4,5,...
@8ed6970 13 INTSXP g0c7 [] (len=1000000, tl=0) 1,2,3,4,5,...
ATTRIB:
@68f6b40 02 LISTSXP g0c0 []
TAG: @4e58868 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "names" (has value)
@613efd0 16 STRSXP g0c2 [] (len=2, tl=0)
@4e93038 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "x"
@4fe8bd8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "y"
TAG: @4e62650 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "row.names" (has value)
@113bb328 13 INTSXP g0c1 [] …Run Code Online (Sandbox Code Playgroud) 我正在接受data.table:
DT <- data.table(num=c(1,4,6,7,8,12,13, 15), let=rep(c("A","B"), each=4))
Run Code Online (Sandbox Code Playgroud)
那么我有以下结果:
> sapply(DT, class)
num let
"numeric" "character"
Run Code Online (Sandbox Code Playgroud)
哪个好.
然后,添加一行:
DT<-rbind(DT, as.list(c(8, "B")))
Run Code Online (Sandbox Code Playgroud)
然后:
> sapply(DT, class)
num let
"character" "character"
Run Code Online (Sandbox Code Playgroud)
我发现这种恶意,R将第一列类型更改为字符并且没有预料到......我之后可以将列更改为数字但是如果我必须在每次插入后检查,那就太痛苦了.
有没有办法添加没有这个缺点的线?