Lapply 数据框列表中的维数不正确..?

Lapply incorrect number of dimensions in a list of data frames..?

我有一个包含数百个数据帧的大列表,并试图从列 Z 中包含模式 VALUE1 和 VALUE2 的两个值之间过滤行。像这样:

weight | height | Z
---------------------------
62      100      NA
65      89       NA
59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
57      84       NA
68      99       NA
59      82       NA
60      87       srebmunmodnarVALUE1txetmodnar
61      86       NA
63      84       srebmunmodnarVALUE2txetmodnar

过滤后我会得到:

59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
60      87       srebmunmodnarVALUE1txetmodnar
61      86       NA
63      84       srebmunmodnarVALUE2txetmodnar

我使用的代码是:

lapply(df, function(x){
  start <- which(grepl("VALUE1", x$Z))
  end   <- which(grepl("VALUE2", x$Z))
  rows  <- unlist(lapply(seq_along(start), function(y){start[y]:end[y]}))
  return(df[rows,])})

但是每当我尝试 运行 脚本时,我都会收到一条错误消息:

df[行,] 错误:维数不正确

为什么会发生这种情况,我该如何解决...?

编辑:添加了实际数据表的最小示例数据(第一个数据框和列表的第一个元素,VALUE2 将始终在某个点跟随 VALUE 1)

> head(tbl[[1]])
# A tibble: 6 × 4
      t speed   off Z                                                                       
  <dbl> <dbl> <dbl> <chr>                                                                   
1  27.3  27.8 0.485 "{\"type\":\"M\",\"msg\":\"VALUE1\",\"time\":27.2498,\"dist\":0.410454}"
2  27.4  27.8 0.457  NA                                                                     
3  27.5  27.8 0.430  NA                                                                     
4  27.6  27.8 0.402  NA                                                                     
5  27.7  27.8 0.374  NA                                                                     
6  27.8  27.8 0.347  NA    

假设'VALUE1'、'VALUE2'的个数相等,得到'VALUE1'、'VALUE2'的位置索引,分别与grep创建一个通过遍历 Mapunlist 中的相应位置来序列 (:) 并使用该序列对数据

进行子集化
df1[sort(unique(unlist(Map(`:`, grep("VALUE1", df1$Z),
       grep("VALUE2", df1$Z))))),]

-输出

 weight height                             Z
3      59     88 randomnumbersVALUE1randomtext
4      66     92                          <NA>
5      64     90                          <NA>
6      64     87 randomnumbersVALUE2randomtext
10     60     87 srebmunmodnarVALUE1txetmodnar
11     61     86                          <NA>
12     63     84 srebmunmodnarVALUE2txetmodnar

如果 df 是单个 data.frame,当我们用 lapply 遍历 data.frame 时,它将遍历列,因此每个 list元素是一个向量。因此,没有x$Z。每个 x 将是相应的列

如果是list,那么当存在没有'VALUE1'或'VALUE2'的情况,或者如果'VALUE1'匹配的数量不是等于 'VALUE2'。在执行 :

之前检查这些元素可能会更好

数据

df1 <- structure(list(weight = c(62L, 65L, 59L, 66L, 64L, 64L, 57L, 
68L, 59L, 60L, 61L, 63L), height = c(100L, 89L, 88L, 92L, 90L, 
87L, 84L, 99L, 82L, 87L, 86L, 84L), Z = c(NA, NA,
 "randomnumbersVALUE1randomtext", 
NA, NA, "randomnumbersVALUE2randomtext", NA, NA, NA, 
"srebmunmodnarVALUE1txetmodnar", 
NA, "srebmunmodnarVALUE2txetmodnar")), 
class = "data.frame", row.names = c(NA, 
-12L))