小编arg*_*t91的帖子

获取父代所有后代的快速方法

关系parent-child数据框如下:

  parent_id child_id
1         1        2
2         2        3
3         3        4
Run Code Online (Sandbox Code Playgroud)

目标是实现以下目标,即先前数据框的扩展版本,其中所有后代(子代、孙子等)都分配给每个父代(包括父代/子代本身):

   parent_id child_id
1          1        1
2          1        2
3          1        3
4          1        4
5          2        2
6          2        3
7          2        4
8          3        3
9          3        4
10         4        4
Run Code Online (Sandbox Code Playgroud)

我的问题是:在 R 中实现这一目标的最快方法(或其中之一)是什么?

我已经尝试过各种方法 - 从 for 循环、SQL 递归到使用igraph(如此处所述。它们都相当慢,并且其中一些在处理大量组合时还容易崩溃。

sqldf下面是和 的示例igraph,在比上面稍大的数据帧上进行基准测试。

library(sqldf)
library(purrr)
library(dplyr)
library(igraph)

df <- data.frame(parent_id = 1:1000L)
df$child_id <- df$parent_id + 1L …
Run Code Online (Sandbox Code Playgroud)

recursion performance r graph-theory igraph

14
推荐指数
2
解决办法
1011
查看次数

dplyr case_when的data.table替代方案

前段时间他们推出一个很好的类似SQL的替代ifelse之内dplyr,即case_when.

是否有相应的data.table允许您在一个[]语句中指定不同的条件,而不加载其他包?

例:

library(dplyr)

df <- data.frame(a = c("a", "b", "a"), b = c("b", "a", "a"))

df <- df %>% mutate(
    new = case_when(
    a == "a" & b == "b" ~ "c",
    a == "b" & b == "a" ~ "d",
    TRUE ~ "e")
    )

  a b new
1 a b   c
2 b a   d
3 a a   e
Run Code Online (Sandbox Code Playgroud)

它肯定会非常有用,并使代码更具可读性(这是我dplyr在这些情况下继续使用的原因之一).

if-statement r dplyr data.table

6
推荐指数
3
解决办法
1842
查看次数

将日期分成几个块,以YYYY-12-31结尾

df <- data.frame(group = c("a", "a", "b", "b"),
                 start = c("2017-05-01", "2019-04-03", "2011-03-03", "2014-05-07"),
                 end = c("2018-09-01", "2020-04-03", "2012-05-03", "2016-04-02"))  
Run Code Online (Sandbox Code Playgroud)

假设我有以下df:

  group      start        end
1     a 2017-05-01 2018-09-01
2     a 2019-04-03 2020-04-03
3     b 2011-03-03 2012-05-03
4     b 2014-05-07 2016-04-02
Run Code Online (Sandbox Code Playgroud)

我想把它变成这种格式,每条记录分为开始日期和后续年份的31/12:

  group      start        end
1     a 2017-05-01 2017-12-31
2     a 2018-01-01 2018-09-01
3     a 2019-04-03 2019-12-31
4     a 2020-01-01 2020-04-03
5     b 2011-03-03 2011-12-31
6     b 2012-01-01 2012-05-03
7     b 2014-05-07 2014-12-31
8     b 2015-01-01 2015-12-31
9     b 2016-01-01 2016-04-02 …
Run Code Online (Sandbox Code Playgroud)

r date date-range

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

可以处理重复的不规则时间序列的滚动窗口函数

我有以下 data.frame:

    grp  nr   yr
 1:   A 1.0 2009
 2:   A 2.0 2009
 3:   A 1.5 2009
 4:   A 1.0 2010
 5:   B 3.0 2009
 6:   B 2.0 2010
 7:   B  NA 2011
 8:   C 3.0 2014
 9:   C 3.0 2019
10:   C 3.0 2020
11:   C 4.0 2021
Run Code Online (Sandbox Code Playgroud)

期望的输出:

   grp  nr   yr nr_roll_period_3
1    A 1.0 2009               NA
2    A 2.0 2009               NA
3    A 1.5 2009               NA
4    A 1.0 2010               NA
5    B 3.0 2009               NA
6 …
Run Code Online (Sandbox Code Playgroud)

r date time-series rolling-computation

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

每行数据帧的向量乘以R之和

我有一个数据框df如下:

    prod sd  c1   c2   c3
1   NA   NA 0.5 0.25 0.25
2   NA   NA 0.5 0.50 0.00
3   NA   NA 0.5 0.00 0.50
Run Code Online (Sandbox Code Playgroud)

和一个向量v = c(0.1, 0.2, 0.3)

对于每一行,我想“求和”df$[,c(3:5)] * v并将结果放入df$prod,这样:

df$prod[1] <- (0.5 * 0.1) + (0.25 * 0.2) + (0.25 * 0.3)
df$prod[2] <- (0.5 * 0.1) + (0.5 * 0.2) + (0 * 0.3)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了许多关于复制 Excels 的 sumproduct 函数的不同主题,并尝试了很多不同的东西,但我一直无法提出一个可行的解决方案。如果有帮助,很高兴详细说明无效的内容,但我怀疑我忽略了一些非常简单的内容。非常感谢任何帮助。

r vector dataframe sumproduct

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