【发布时间】:2023-03-28 03:51:01
【问题描述】:
我想添加一个新列,其中包含来自另一列的前 n 个元素的向量(或列表)。分组后进行计算。
这是一个 n=2 的示例。输入:
v0 = c(rep("a",5),rep("b",5))
v1 = 1:10
DF1 <- data.frame(v0,v1)
> DF1
v0 v1
1 a 1
2 a 2
3 a 3
4 a 4
5 a 5
6 b 6
7 b 7
8 b 8
9 b 9
10 b 10
输出:新列应该是整数向量(或列表)并包含以下值:
> DF2_L
v0 v1 myL
1 a 1 NA, NA
2 a 2 1, NA
3 a 3 2, 1
4 a 4 3, 2
5 a 5 4, 3
6 b 6 5, 4
7 b 7 6, 5
8 b 8 7, 6
9 b 9 8, 7
10 b 10 9, 8
一个简单的解决方案是
DF2 <- DF1 %>% group_by(v0) %>%
mutate(i1=lag(v1,1), i2=lag(v1,2),
myL = mapply(c, i1, i2, SIMPLIFY = F))%>%
select(-c(i1,i2))
但是这只是一个简化的表格。对于我的计算,n 是 36。这意味着我需要为 lag(v1,1)、lag(v1,2) ... lag(v1,36) 创建 36 个新的“虚拟”列,并将它们组合成一个列表。这不方便。它必须是另一种方式。
我想使用 rollapply。使用 F = list 但我收到错误消息
t <- DF1 %>% group_by(v0) %>%
mutate( myL= rollapply(lag(v1),
2, fill=NA, align="right",
list))
Error: Problem with `mutate()` input `myL`.
x “x” : attempt to define invalid zoo object
i Input `myL` is `rollapply(lag(v1), 2, fill = NA, align = "right", list)`.
i The error occurred in group 1: v0 = "a".
Run `rlang::last_error()` to see where the error occurred.
当我使用 FUN = c.我将每个元素作为一个单独的列
t <- DF1 %>% group_by(v0) %>%
mutate( myL= rollapply(lag(v1),
2, fill=NA, align="right",
c))
v0 v1 myL[,1] [,2]
<fct> <int> <int> <int>
1 a 1 NA NA
2 a 2 NA 1
3 a 3 1 2
4 a 4 2 3
5 a 5 3 4
6 b 6 NA NA
7 b 7 NA 6
8 b 8 6 7
9 b 9 7 8
10 b 10 8 9
【问题讨论】:
标签: r dataframe analytics lag rolling-computation