我想问一下以下行为data.table是功能还是错误。
鉴于 data.table
dt = data.table(
group = c(rep('group1',5),rep('group2',5)),
x = as.numeric(c(1:5, 1:5)),
y = as.numeric(c(5:1, 5:1)),
z = as.numeric(c(1,2,3,2,1, 1,2,3,2,1))
)
Run Code Online (Sandbox Code Playgroud)
以及包含重复项的列名向量,
cols = c('y','x','y','z') # contains a duplicate column name
Run Code Online (Sandbox Code Playgroud)
data.table 正确地阻止我为重复的列名分配值:
dt[,(cols) := lapply(.SD,identity), .SDcols=cols] # Error (OK)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是合适的行为,因为它可以帮助避免意外后果。但是,如果我按组做相同的作业,
dt[,(cols) := lapply(.SD,identity), .SDcols=cols, by=group] # No error!
Run Code Online (Sandbox Code Playgroud)
然后data.table不会抛出错误。分配通过,并且可以验证列y和z已互换。
这对我来说发生在一个大型应用程序中,同时按组贬低变量,并且很难追踪这种行为的来源。对用户的建议当然是在分配时避免重复列名,并避免向.SDcols. 但是,data.table在这种情况下抛出错误不是更好吗?
我试图在ggplot2中制作一个散点图,其大小映射到第三个变量和density2d轮廓.似乎传说因包含density2d轮廓而感到困惑.
例如,以下代码有效:
library('ggplot2')
set.seed(1)
x=rnorm(100); y=rnorm(100,sd=10); z=seq(1,10,length.out=100)
dd=data.frame(x=x,y=y,z=z)
ggplot(dd,aes(x,y,size=z))+geom_point()
Run Code Online (Sandbox Code Playgroud)

但现在,请注意,当我添加一个调用时,图例表现异常stat_density2d().特别是,图例显示蓝色块而不是黑色圆圈:
ggplot(dd,aes(x,y,size=z))+geom_point()+stat_density2d()
Run Code Online (Sandbox Code Playgroud)
