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
创建一个通过遍历 Map
、unlist
中的相应位置来序列 (:
) 并使用该序列对数据
进行子集化
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))
我有一个包含数百个数据帧的大列表,并试图从列 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
创建一个通过遍历 Map
、unlist
中的相应位置来序列 (:
) 并使用该序列对数据
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))