你能帮我把一个来自runner函数的列表转换成一个数据帧吗?
下面是我的简化示例:
library(runner)
# Random Data
rdata <- data.frame(ID=seq(100),A=runif(100),B=runif(100))
head(rdata)
ID A B
1 1 0.4566914 0.62081081
2 2 0.3931568 0.38796394
3 3 0.4155734 0.91134851
4 4 0.6471508 0.96903488
5 5 0.4087917 0.02486545
6 6 0.1460227 0.62266711
# Some function with data frame as an output
foo <- function(RDATA){
A_MinMax <- c(which.max(RDATA$A),which.min(RDATA$A))
B_MinMax <- c(which.max(RDATA$B),which.min(RDATA$B))
data.frame(A_MinMax,B_MinMax)
}
# Moving window with list as an output
Output <- runner::runner(
x = rdata,
k = 10,
idx ="ID",
at = seq(10,100,10),
lag = 0,
f = function(x){foo(RDATA=x)}
)
Output
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
A_MinMax integer,2 integer,2 integer,2 integer,2 integer,2 integer,2 integer,2 integer,2
B_MinMax integer,2 integer,2 integer,2 integer,2 integer,2 integer,2 integer,2 integer,2
[,9] [,10]
A_MinMax integer,2 integer,2
B_MinMax integer,2 integer,2
# List structure
str(Output)
List of 20
$ : int [1:2] 8 10
$ : int [1:2] 4 5
$ : int [1:2] 10 9
$ : int [1:2] 5 10
$ : int [1:2] 4 10
$ : int [1:2] 9 3
$ : int [1:2] 5 9
$ : int [1:2] 10 4
$ : int [1:2] 9 2
$ : int [1:2] 6 8
$ : int [1:2] 3 7
$ : int [1:2] 6 3
$ : int [1:2] 10 6
$ : int [1:2] 3 7
$ : int [1:2] 8 1
$ : int [1:2] 5 1
$ : int [1:2] 7 3
$ : int [1:2] 8 5
$ : int [1:2] 10 5
$ : int [1:2] 1 6
- attr(*, "dim")= int [1:2] 2 10
- attr(*, "dimnames")=List of 2
..$ : chr [1:2] "A_MinMax" "B_MinMax"
..$ : NULL
# Loop for converting the list in a data frame
for (i in 1:2){
res <-data.frame()
res <- rbind.data.frame(res,as.data.frame(Output[,i]))
res
}
# The loop is storing in "res" only the last "i"=2
res
A_MinMax B_MinMax
1 10 5
2 9 10
# Desired output
rbind.data.frame(as.data.frame(Output[,1]),as.data.frame(Output[,2]))
A_MinMax B_MinMax
1 8 4
2 10 5
3 10 5
4 9 10
我不能像上面的例子那样通过循环将主列表中的所有列表存储在单个数据帧中。我也想知道,为什么循环只保存最后一个" I "
最诚挚的问候,约翰
这确实有效,但我想知道是否没有一种更简洁的方法来使用基本R函数。
library(tidyr)
separate_rows(data.frame(t(Output))) %>%
unnest(cols = c(A_MinMax, B_MinMax))
# A tibble: 20 x 2
A_MinMax B_MinMax
<int> <int>
1 2 6
2 8 10
3 7 2
4 8 7
5 3 8
6 5 9
7 9 4
8 5 8
9 4 8
10 3 2
11 4 3
12 5 8
13 2 1
14 6 9
15 6 7
16 10 6
17 5 1
18 9 9
19 4 2
20 2 6
data I used:
set.seed(42)
rdata <- data.frame(ID=seq(100),A=runif(100),B=runif(100))