r-如何将逻辑列折叠为TRUE FALSE TRUE..并创建一个具有原始连续值数的新列



我想在列表中创建新的数据帧,其中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  

相关内容

最新更新