关系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) 前段时间他们推出一个很好的类似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
在这些情况下继续使用的原因之一).
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) 我有以下 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) 我有一个数据框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 ×5
date ×2
data.table ×1
dataframe ×1
date-range ×1
dplyr ×1
graph-theory ×1
if-statement ×1
igraph ×1
performance ×1
recursion ×1
sumproduct ×1
time-series ×1
vector ×1