我想在列表中创建新的数据帧,其中TRUE和FALSE逻辑交替,并在新列中显示它们在列表中原始数据帧中连续出现的频率。
library(dplyr)
set.seed(94756)
mat1 <- matrix(sample(seq(-1,100, 0.11),50, replace = TRUE),ncol = 5)
mat1 <- as_tibble(mat1)
mat2 <- matrix(sample(seq(-1,100, 0.11),50, replace = TRUE),ncol = 5)
mat2 <- as_tibble(mat2)
mat3 <- matrix(sample(seq(-1,100, 0.11), 50,replace = TRUE),ncol = 5)
mat3 <- as_tibble(mat3)
data <- list(mat1, mat2, mat3)
data1 <- purrr::map(data, ~tibble::add_column(., V1_logical = between(.$V2, 20, 60), .after = 'V1'))
r_pre <- lapply(data1, "[", 2)
最后我得到了这样一个例子:
$logical = TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE ...
$length = 2, 1, 3 (=marker), 2, 1, 3, 7...
类似的东西
bind_rows(r_pre, .id = "i") %>% group_by(i) %>% count(V1_logical)
# A tibble: 6 × 3
# Groups: i [3]
i V1_logical n
<chr> <lgl> <int>
1 1 FALSE 3
2 1 TRUE 7
3 2 FALSE 5
4 2 TRUE 5
5 3 FALSE 2
6 3 TRUE 8
你也可以用map
来做这件事(它可能更高效(,但这似乎有效。。。
如果您想要TRUE/FALSE的运行次数,例如向量{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE}
应该产生一个分量(2,2,1((T/F连续运行的次数(,并且假设您想要将所有结果连接到一个tibble中,请尝试类似的方法
rfun <- function(x) with(rle(x[[1]]), tibble(lengths, values))
purrr::map_dfr(r_pre, rfun)
# A tibble: 15 × 2
lengths values
<int> <lgl>
1 1 TRUE
2 1 FALSE
3 2 TRUE
4 1 FALSE
...
如果你想把它作为三个tibble的列表,只需使用purrr::map
而不是map_dfr
:
purrr::map(r_pre, rfun)
[[1]]
# A tibble: 6 × 2
lengths values
<int> <lgl>
1 1 TRUE
2 1 FALSE
3 2 TRUE
4 1 FALSE
5 4 TRUE
6 1 FALSE
[[2]]
# A tibble: 7 × 2
lengths values
<int> <lgl>
1 2 TRUE
2 1 FALSE
3 1 TRUE
4 2 FALSE
5 1 TRUE
6 2 FALSE
7 1 TRUE
[[3]]
# A tibble: 2 × 2
lengths values
<int> <lgl>
1 2 FALSE
2 8 TRUE