我有一個看起來像這樣的串列:
list(list("A[1]" = data.frame(W = 1:5),
"A[2]" = data.frame(X = 6:10),
B = data.frame(Y = 11:15),
C = data.frame(Z = 16:20)),
list("A[1]" = data.frame(W = 21:25),
"A[2]" = data.frame(X = 26:30),
B = data.frame(Y = 31:35),
C = data.frame(Z = 36:40)),
list("A[1]" = data.frame(W = 41:45),
"A[2]" = data.frame(X = 46:50),
B = data.frame(Y = 51:55),
C = data.frame(Z = 56:60))) -> dflist
我需要我的輸出也是長度為 3 的串列串列,以便每個子串列保留名稱開頭的元素,A[同時洗掉其他元素。
基于之前的一些問題,我正在嘗試使用這個:
dflist %>%
map(keep, names(.) %in% "A[")
但這給出了以下錯誤:
Error in probe(.x, .p, ...) : length(.p) == length(.x) is not TRUE
嘗試選擇單個元素,例如A[1]像這樣:
dflist %>%
map(keep, names(.) %in% "A[1]")
也不起作用。我怎樣才能達到預期的輸出?
uj5u.com熱心網友回復:
我想你想要:
purrr::map(dflist, ~.[stringr::str_starts(names(.), "A\\[")])
它的作用是:
- 對于每個子串列 (
purrr::map)- 選擇該子串列的所有元素(
.[],其中.是子串列) - 誰的名字以
A[(stringr::str_starts(names(.), "A\\["))開頭
- 選擇該子串列的所有元素(
您得到了map正確的頂級,因為您要修改子串列。但是,map(keep, names(.) %in% "A[")有一些問題:
names(.) %in% "A["應該是一個函式或公式(以~purrr::keep將過濾函式應用于子串列的每個元素,即直接應用于資料幀。它永遠不會“看到”每個資料框的名稱。其實我認為你根本keep無法解決這個問題
無論如何,這會產生:
[[1]]
[[1]]$`A[1]`
W
1 1
2 2
3 3
4 4
5 5
[[1]]$`A[2]`
X
1 6
2 7
3 8
4 9
5 10
[[2]]
[[2]]$`A[1]`
W
1 21
2 22
3 23
4 24
5 25
[[2]]$`A[2]`
X
1 26
2 27
3 28
4 29
5 30
[[3]]
[[3]]$`A[1]`
W
1 41
2 42
3 43
4 44
5 45
[[3]]$`A[2]`
X
1 46
2 47
3 48
4 49
5 50
uj5u.com熱心網友回復:
如果我們想使用keep,使用
library(dplyr)
library(purrr)
library(stringr)
map(dflist, ~ keep(.x, str_detect(names(.x), fixed("A["))))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350423.html
上一篇:使用分離和變異函式
