在数据框列表中应用错误的维数..?

发布于 2025-01-17 04:31:10 字数 1976 浏览 1 评论 0原文

我有一个包含数百个数据帧的大型列表,并尝试从 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[rows, ] 中的错误:维度数不正确

为什么会发生这种情况以及如何解决它......?

编辑:添加了实际数据表的最小样本数据(列表的第一个数据框和第一个元素,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    

I have a large list of several hundreds of data frames and trying to filter rows from between two values containing a pattern VALUE1 and VALUE2 in the column Z. Like this:

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

And after filtering I would get:

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

The code I'm using is:

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,])})

But whenever I try to run the script, I get an error message saying:

Error in df[rows, ] : incorrect number of dimensions

Why does this happen and how can I get around it..?

EDIT: Added a minimal sample data of the actual datasheet (the first data frame and first element of the list, VALUE2 will follow VALUE 1 always at some point)

> 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    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

徒留西风 2025-01-24 04:31:10

假设'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 是单个数据。框架,当我们使用 lapply 循环遍历 data.frame,它将循环遍历列,因此每个 list 元素都是一个向量。因此,不存在x$Z。每个x将是相应的列

如果它是一个列表,那么当存在没有'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))

Assuming there are equal number of 'VALUE1', 'VALUE2', get the position index of 'VALUE1', 'VALUE2', separately with grep, create a sequence (:) by looping over the corresponding positions in Map, unlist and use the sequence to subset the data

df1[sort(unique(unlist(Map(`:`, grep("VALUE1", df1$Z),
       grep("VALUE2", df1$Z))))),]

-output

 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

If the df is a single data.frame, when we loop over the data.frame with lapply, it will be looping over the columns and thus each list element is a vector. Therefore, there is no x$Z. Each x will be the corresponding column

If it is a list, then the error can occur when there are cases with no 'VALUE1' or 'VALUE2' or if the number of 'VALUE1' matches are not equal to 'VALUE2'. It may be better to check those elements before doing the :

data

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))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文