相关疑难解决方法(0)

如何在data.table中按引用删除行?

我的问题与引用分配和复制分配有关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)

r data.table

144
推荐指数
5
解决办法
5万
查看次数

在`data.table`中使用动态列名

我想计算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)

r data.table

32
推荐指数
1
解决办法
2万
查看次数

使用data.table聚合所有列

我想做相同的以下内容,但使用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解决方案是'可行.

aggregate r data.table

17
推荐指数
1
解决办法
1万
查看次数

关于data.table 1.9.2中的GForce

我不知道如何在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 data.table

14
推荐指数
1
解决办法
2019
查看次数

使用同一组中满足条件的下一个第一行设置列值

我是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)

我想做的是

  • 子集(组) id
  • 每行
  • 找到date_up第一行,
  • 其中,code …

r data.table

10
推荐指数
1
解决办法
599
查看次数

检查唯一值并在 R data.table 中只有一个唯一值时返回它的最快方法

假设我有一个大的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)

r data.table

9
推荐指数
1
解决办法
202
查看次数

根据另一列中的最高值选择一个值

我不明白为什么我找不到解决方案,因为我觉得这是一个非常基本的问题.那么需要寻求帮助.我想按月重新安排空气质量数据集,每个月的最大温度值.另外,我想找到每个月最高温度的相应日期.什么是最懒惰(代码方式)的方法呢?

我试过没有成功:

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)

r reshape2

8
推荐指数
2
解决办法
5141
查看次数

使用data.table包通过引用进行条件二进制连接和更新

所以这是我现实生活中的问题,我觉得这个问题很容易解决,我在这里遗漏了一些明显的东西.我有两个叫做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)

join r data.table

8
推荐指数
2
解决办法
489
查看次数

如何将函数应用于data.table的子集,使用by并将所有列公开给函数?

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)

r data.table

7
推荐指数
1
解决办法
4075
查看次数

有哪些算法/编程优化可以使data.table更快?

我已经在Internet和SO上进行了一些搜索,以寻找对data.table如此快的方法的介绍或分析,但是我只发现了很多(非常有用的)手册,而没有深入了解编程内容。(我或多或少地完全data.table陷入了无法找到的已发表论文的地步,甚至找不到JStatSoft的文章。)

我上过算法课,所以我知道排序和链表以及二叉树等,但是我不想作任何业余猜测(尤其是当我向学术界人士解释为什么使用它是一个好主意时) )。谁能提供简短的主题摘要以及参考资料?这个问题引用了一个很酷的幻灯片演示文稿,但是信息是分块的(甚至文档setkey()也没有引用data.table,而是转到Wikipedia)。

我所寻找的东西,既没有源代码,不是维基百科主题的列表,而是一个理想的“官方”,来源答案(从而使之规范,可能有很大的帮助与所有 问题, 轨道 围绕这个话题)。

(如果有一份技术文件,在那里我可以举这个(在这将是巨大citation()data.table仅仅是手动的,但是当然这并不是问题,只要SO关注直接相关的。)

algorithm optimization r data.table

6
推荐指数
0
解决办法
240
查看次数

从数据框中仅删除零值的时间序列

我有一个数据框,其中包含由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 time-series dataframe data.table

4
推荐指数
1
解决办法
1648
查看次数

R数据表中的"*ply"功能

我正在寻找一种方法来使用拆分应用组合策略与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 发送给它们,而不必征用所有字段名称.

r data.table

3
推荐指数
1
解决办法
587
查看次数

通过向量乘以data.table的列

我有一个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 data.table

0
推荐指数
1
解决办法
438
查看次数