我的问题与引用分配和复制分配有关data.table.我想知道是否可以通过引用删除行,类似于
DT[ , someCol := NULL]
Run Code Online (Sandbox Code Playgroud)
我想知道
DT[someRow := NULL, ]
Run Code Online (Sandbox Code Playgroud)
我想有一个很好的理由说明为什么这个功能不存在,所以也许你可以指出一个很好的替代通常的复制方法,如下所示.特别是,从我的例子(data.table)开始,
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 …Run Code Online (Sandbox Code Playgroud) 我想计算data.table中每个列的平均值,按另一列分组.我的问题类似于关于SO的另外两个问题(一个和两个),但我不能将这些问题应用于我的问题.
这是一个例子:
library(data.table)
dtb <- fread(input = "condition,var1,var2,var3
one,100,1000,10000
one,101,1001,10001
one,102,1002,10002
two,103,1003,10003
two,104,1004,10004
two,105,1005,10005
three,106,1006,10006
three,107,1007,10007
three,108,1008,10008
four,109,1009,10009
four,110,1010,10010")
dtb
# condition var1 var2 var3
# 1: one 100 1000 10000
# 2: one 101 1001 10001
# 3: one 102 1002 10002
# 4: two 103 1003 10003
# 5: two 104 1004 10004
# 6: two 105 1005 10005
# 7: three 106 1006 10006
# 8: three 107 1007 10007
# 9: three …Run Code Online (Sandbox Code Playgroud) 我想做相同的以下内容,但使用data.table的"by":
dt <- data.table(V1=rnorm(100), V2=rnorm(100), V3=rnorm(100), ...
group=rbinom(100,2,.5))
dt.agg <- aggregate(dt, by=list(dt$group), FUN=mean)
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
dt.agg <- dt[, list(V1=mean(V1), V2=mean(V2), V3=mean(V3)), by=group]
Run Code Online (Sandbox Code Playgroud)
但对于这种情况,我正在考虑我有100个左右的列V1-V100(而且我总是希望通过单个因子聚合所有这些,如上面的汇总)所以我上面提到的data.table解决方案是'可行.
我不知道如何在data.table 1.9.2中充分利用GForce
新的优化:GForce.不是对数据进行分组,而是将组位置传递到sum和mean(gsum和gmean)的分组版本,然后计算单个顺序传递列中所有组的结果以获得缓存效率.此外,由于g*函数只被调用一次,我们不需要找到加速调用sum的方法或重复每个组的平均值.`
提交以下代码时
DT <- data.table(A=c(NA,NA,1:3), B=c("a",NA,letters[1:3]))
DT[,sum(A,na.rm=TRUE),by= B]
Run Code Online (Sandbox Code Playgroud)
我懂了
B V1
1: a 1
2: NA 0
3: b 2
4: c 3
当DT[,sum(A,na.rm=FALSE),by= B]我尝试时,我得到了
B V1
1: a NA
2: NA NA
3: b 2
4: c 3
这个结果是否解释了GForce的作用,添加na.rm = TRUE/FALSE选项?
非常感谢!
我是R的新手,这是我关于stackoverflow的第一个问题。
我在尝试
示例数据:
id code date_down date_up
1: 1 p 2019-01-01 2019-01-02
2: 1 f 2019-01-02 2019-01-03
3: 2 f 2019-01-02 2019-01-02
4: 2 p 2019-01-03 <NA>
5: 3 p 2019-01-04 <NA>
6: 4 <NA> 2019-01-05 2019-01-05
7: 5 f 2019-01-07 2019-01-08
8: 5 p 2019-01-07 2019-01-08
9: 5 p 2019-01-09 2019-01-09
10: 6 f 2019-01-10 2019-01-10
11: 6 p 2019-01-10 2019-01-10
12: 6 p 2019-01-10 2019-01-11
Run Code Online (Sandbox Code Playgroud)
我想做的是
iddate_up第一行,code …假设我有一个大的data.table,看起来像dt下面。
dt <- data.table(
player_1 = c("a", "b", "b", "c"),
player_1_age = c(10, 20, 20, 30),
player_2 = c("b", "a", "c", "a"),
player_2_age = c(20, 10, 30, 10)
)
# dt
# player_1 player_1_age player_2 player_2_age
# 1: a 10 b 20
# 2: b 20 a 10
# 3: b 20 c 30
# 4: c 30 a 10
Run Code Online (Sandbox Code Playgroud)
根据dt以上内容,我想创建一个data.table具有独特玩家及其年龄的人,如下所示player_dt:
# player_dt
# player age
# a 10
# …Run Code Online (Sandbox Code Playgroud) 我不明白为什么我找不到解决方案,因为我觉得这是一个非常基本的问题.那么需要寻求帮助.我想按月重新安排空气质量数据集,每个月的最大温度值.另外,我想找到每个月最高温度的相应日期.什么是最懒惰(代码方式)的方法呢?
我试过没有成功:
require(reshape2)
names(airquality) <- tolower(names(airquality))
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp"))
dcast(mm, month + day ~ variable, max)
aggregate(formula = temp ~ month + day, data = airquality, FUN = max)
Run Code Online (Sandbox Code Playgroud)
我是这样的:
month day temp
5 7 89
...
Run Code Online (Sandbox Code Playgroud) 所以这是我现实生活中的问题,我觉得这个问题很容易解决,我在这里遗漏了一些明显的东西.我有两个叫做TK和的大数据集DFT
library(data.table)
set.seed(123)
(TK <- data.table(venue_id = rep(1:3, each = 2),
DFT_id = rep(1:3, 2),
New_id = sample(1e4, 6),
key = "DFT_id"))
# venue_id DFT_id New_id
# 1: 1 1 2876
# 2: 1 2 7883
# 3: 2 3 4089
# 4: 2 1 8828
# 5: 3 2 9401
# 6: 3 3 456
(DFT <- data.table(venue_id = rep(1:2, each = 2),
DFT_id = 1:4,
New_id = sample(4),
key = "DFT_id"))
# venue_id DFT_id New_id …Run Code Online (Sandbox Code Playgroud) 在data.table按组切片时,用于切片数据的变量在函数执行期间不在子集中.我用这个证明了这个debugonce.
library(data.table)
x <- data.table(a = rep(letters[1:4], each = 3), b = rep(c("a", "b"), each = 6), c = rnorm(12))
myfun <- function(y) paste(y$a, y$b, y$c, collapse = "")
> debugonce(myfun)
> x[, myfun(.SD), by = .(b, a)]
debugging in: myfun(.SD)
debug: paste(y$a, y$b, y$c, collapse = "")
Browse[2]> y
c
1: -1.2662416
2: 0.9818497
3: -0.5395385
Run Code Online (Sandbox Code Playgroud)
我所追求的是split-sapply范例的功能,我将根据factor(s)切片data.frame并将该函数应用于所有列,也就是说,还包括用于切片的变量它(如下所示).
> debugonce(myfun)
> sapply(split(x, f = list(x$b, x$a)), FUN = myfun)
debugging in: FUN(X[[i]], ...)
debug: paste(y$a, y$b, …Run Code Online (Sandbox Code Playgroud) 我已经在Internet和SO上进行了一些搜索,以寻找对data.table如此快的方法的介绍或分析,但是我只发现了很多(非常有用的)手册,而没有深入了解编程内容。(我或多或少地完全data.table陷入了无法找到的已发表论文的地步,甚至找不到JStatSoft的文章。)
我上过算法课,所以我知道排序和链表以及二叉树等,但是我不想作任何业余猜测(尤其是当我向学术界人士解释为什么使用它是一个好主意时) )。谁能提供简短的主题摘要以及参考资料?这个问题引用了一个很酷的幻灯片演示文稿,但是信息是分块的(甚至文档setkey()也没有引用data.table,而是转到Wikipedia)。
我所寻找的东西,既没有源代码,不是维基百科主题的列表,而是一个理想的“官方”,来源答案(从而使之规范,可能有很大的帮助与所有 的 问题, 轨道 围绕这个话题)。
(如果有一份技术文件,在那里我可以举这个(在这将是巨大citation()的data.table仅仅是手动的,但是当然这并不是问题,只要SO关注直接相关的。)
我有一个数据框,其中包含由uniquer id识别的多个时间序列.我想删除任何只有0值的时间序列.
数据框如下所示,
id date value
AAA 2010/01/01 9
AAA 2010/01/02 10
AAA 2010/01/03 8
AAA 2010/01/04 4
AAA 2010/01/05 12
B 2010/01/01 0
B 2010/01/02 0
B 2010/01/03 0
B 2010/01/04 0
B 2010/01/05 0
CCC 2010/01/01 45
CCC 2010/01/02 46
CCC 2010/01/03 0
CCC 2010/01/04 0
CCC 2010/01/05 40
Run Code Online (Sandbox Code Playgroud)
我想要删除任何只有0值的时间序列,以便数据框看起来如下,
id date value
AAA 2010/01/01 9
AAA 2010/01/02 10
AAA 2010/01/03 8
AAA 2010/01/04 4
AAA 2010/01/05 12
CCC 2010/01/01 45
CCC 2010/01/02 46
CCC 2010/01/03 0
CCC …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来使用拆分应用组合策略与R的data.table包.
library(data.table)
# take a data.table object, return integer
func <- function(DT)
{
DT$a * DT$a
}
DT = data.table(
a = 1:50
# ... further fields here
b = rep(1:10, 5)
)
# this obviously won't work:
DT[, result:=func, by=b]
# but this will (based on @Aruns answer below)
DT[, result:=func(.SD), by=b]
Run Code Online (Sandbox Code Playgroud)
虽然这里非常简单data.table,但结构更复杂,我希望能够将逻辑提取到函数中并将子集作为data.tables 发送给它们,而不必征用所有字段名称.
我有一个data.table,我希望将第1列中的所有值乘以向量的第一个元素,然后将第2列中的所有值乘以向量的第2个元素,等等......
dt <- data.table(col1=c(1,1,1,1), col2=c(2,2,2,2), col3=c(3,3,3,3))
v <- c(1,2,3)
Run Code Online (Sandbox Code Playgroud)
对于data.frame,我会这样做
dt.new <- sapply(1:ncol(dt), function(i) dt[, i] * vec[i])
Run Code Online (Sandbox Code Playgroud)
但它对data.table不起作用.我试过了
cols <- c("col1", "col2", "col3")
dt.new <- dt[, (cols):= lapply(.SD, function(i) dt[[i]]*v[i]), .SDcols = cols]
Run Code Online (Sandbox Code Playgroud)
它也不起作用.我怎样才能做到这一点?
r ×13
data.table ×12
aggregate ×1
algorithm ×1
dataframe ×1
join ×1
optimization ×1
reshape2 ×1
time-series ×1