使用分配给多个列的最佳方法是什么data.table
?例如:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情(当然这种语法不正确):
x[ , (col1, col2) := f(), by = "id"]
Run Code Online (Sandbox Code Playgroud)
为了扩展它,我可能有很多列的名称存储在一个变量(比如说col_names
)中,我想这样做:
x[ , col_names := another_f(), by = "id", with = FALSE]
Run Code Online (Sandbox Code Playgroud)
做这样的事的正确方法是什么?
假设我有一个这样的列表:
x = list(list(1,2), list(3,4), list(5,6))
Run Code Online (Sandbox Code Playgroud)
我想要一个只包含嵌套列表的第一个元素的列表.我可以通过返回另一个列表来做到这一点
x1 = lapply(x, function(l) l[[1]])
Run Code Online (Sandbox Code Playgroud)
这有快捷符号吗?
我似乎无法找到关于究竟.EACHI
做什么的任何文档data.table
.我在文档中看到它的简要提及:
在i和设置中传递这些组时,已知组子集的聚合特别有效
by=.EACHI
.何时i
是data.table,DT[i,j,by=.EACHI]
评估连接中每一行j
的组.我们称之为每个i的分组.DT
i
但是,"群体"在上下文中DT
是什么意思?是否由设置的密钥确定的组DT
?该组是否每个使用所有列作为键的不同行?我完全理解如何运行类似DT[i,j,by=my_grouping_variable]
但是如何.EACHI
工作的困惑.有人可以解释一下吗?
我有一个data.table
不是很大(2 GB)但由于某种原因write.csv
需要很长时间才能写出来(我从未真正完成等待)并且似乎使用了大量的RAM来完成它.
我尝试将其转换data.table
为a,data.frame
尽管自从data.table
扩展以来这不应该做任何事情data.frame
.有没有人碰到这个?
更重要的是,如果你用Ctrl- 来阻止它C,R似乎没有给回记忆.
有非常好的方法来xts
对象进行子集化.例如,可以获取所有年,月,日的所有数据,但严格地在上午9:30到下午4点之间执行:
my_xts["T09:30/T16:00"]
Run Code Online (Sandbox Code Playgroud)
或者您可以通过以下方式获得两个日期之间的所有观察:
my_xts["2012-01-01/2012-03-31"]
Run Code Online (Sandbox Code Playgroud)
或者在某个特定日期之前/之后的所有日期:
my_xts["/2011"] # from start of data until end of 2011
my_xts["2011/"] # from 2011 until the end of the data
Run Code Online (Sandbox Code Playgroud)
如何获取所有年份的特定月份或所有月份和年份的特定日期的所有数据?是否存在任何其他子集技巧?
我试图理解为什么开发已经转变reshape
为reshape2
包装.它们似乎在功能上是相同的,但是,reshape2
由于服务器上运行的旧版本的R ,我无法升级到当前.我担心一个主要错误的可能性会将开发转移到一个全新的包而不是简单地继续开发reshape
.有谁知道reshape
包装中是否存在重大缺陷?
在R中扩展循环中的数据结构是低效的.我如何预先分配list
一定的尺寸?matrix
通过ncol
和nrow
参数使这很容易.如何在列表中执行此操作?例如:
x <- list()
for (i in 1:10) {
x[[i]] <- i
}
Run Code Online (Sandbox Code Playgroud)
我认为这是低效的.有什么更好的方法呢?
我试图更多地了解滚动连接的工作方式和一些混乱,我希望有人可以为我澄清这一点.举一个具体的例子:
dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个long data.table
,其中值为dt2
:
dt1[dt2,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
相反,正确的方法似乎是:
dt2[dt1,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释更多关于如何加入data.table
作品,因为我显然没有正确理解它.我认为这dt1[dt2,roll=TRUE]
对应于sql等价select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t)
,除了增加的功能locf.
另外文档说:
X[Y] is a join, looking up X's rows using Y (or Y's key if it has one)
as an index.
Run Code Online (Sandbox Code Playgroud)
这使得似乎只返回X中的内容,正在进行的连接是内连接,而不是外连接.roll=T
那个什么时候但那个特别id
不存在dt1
?多玩一点我无法理解列中放置了什么值.
我无法理解R函数rank
和R函数之间的区别order
.他们似乎产生相同的输出:
> rank(c(10,30,20,50,40))
[1] 1 3 2 5 4
> order(c(10,30,20,50,40))
[1] 1 3 2 5 4
Run Code Online (Sandbox Code Playgroud)
有人可以为我阐明这个吗?谢谢
我知道一个可以合并(加入)两大data.table
争夺的merge
功能或[.data.table
功能.但是,如果我说10,data.table
s并且想要do.call
将它们全部合并在一起,是否有一个功能可以做到这一点?目前我do.call(cbind, ...)
只使用非常特殊的情况.
r ×10
data.table ×5
dataframe ×2
join ×2
list ×2
performance ×2
time-series ×2
colon-equals ×1
csv ×1
file-io ×1
group-by ×1
memory ×1
merge ×1
reshape ×1
reshape2 ×1
sorting ×1
subset ×1
xts ×1