如何在 R 中的非结构化数据框中定位数据的结构化区域?

How to locate a structured region of data inside of a not structured data frame in R?

我有一种包含感兴趣子集的数据框。 问题是这个子集在不同的数据帧之间不一致。尽管如此,在更抽象的层面,遵循一个通用结构:数据框内的一个矩形区域。

example1 <- data.frame(x = c("name", "129-2", NA, NA, "acc", 2, 3, 4, NA, NA), 
       y = c(NA, NA, NA, NA, "deb", 3, 2, 5, NA, NA),
       z = c(NA, NA, NA, NA, "asset", 1, 1, 2, NA, NA))

print(example1)

      x    y     z
1   name <NA>  <NA>
2  129-2 <NA>  <NA>
3   <NA> <NA>  <NA>
4   <NA> <NA>  <NA>
5    acc  deb asset
6      2    3     1
7      3    2     1
8      4    5     2
9   <NA> <NA>  <NA>
10  <NA> <NA>  <NA>

example1包含一个清晰的矩形区域,结构信息:

5    acc  deb asset
6      2    3     1
7      3    2     1
8      4    5     2

如前所述,区域并不总是一致的,

  1. 列的位置并不总是相同
  2. 感兴趣的子集内的变量名称并不总是相同

这里还有一个example2:

example2 <- data.frame(x = c("name", "129-2", "wallabe #23", NA, NA, "acc", 2, 3, 4, NA ), 
       y = c(NA, NA, NA, NA, "balance", "deb", 3, 2, 5, NA),
       z = c(NA, NA, NA, NA, NA, "asset", 1, 1, 2, NA),
       u = c(NA, NA, NA, "currency:", NA, NA, NA, NA, NA, NA),
       i = c(NA, NA, NA, "USD", "result", "win", 2, 3, 1, NA),
       o = c(NA, NA, NA, NA, NA, "lose", 2, 2, 1, NA))

print(example2)
> example2
            x       y     z         u      i    o
1         name    <NA>  <NA>      <NA>   <NA> <NA>
2        129-2    <NA>  <NA>      <NA>   <NA> <NA>
3  wallabe #23    <NA>  <NA>      <NA>   <NA> <NA>
4         <NA>    <NA>  <NA> currency:    USD <NA>
5         <NA> balance  <NA>      <NA> result <NA>
6          acc     deb asset      <NA>    win lose
7            2       3     1      <NA>      2    2
8            3       2     1      <NA>      3    2
9            4       5     2      <NA>      1    1
10        <NA>    <NA>  <NA>      <NA>   <NA> <NA>

example2包含一个不清楚的矩形区域:

6          acc     deb asset      <NA>    win lose
7            2       3     1      <NA>      2    2
8            3       2     1      <NA>      3    2
9            4       5     2      <NA>      1    1

一种扫描此数据框以在其中定位此类区域的方法?

任何想法表示赞赏

您可能想尝试具有相同数量 NA 的最长序列:

findTable <- function(df){
  naSeq <- rowSums(is.na(df))          # How many NA per row
  myRle <- rle(naSeq )$length          # Find sequences length
  df[rep(myRle == max(myRle), myRle),] # Get longest sequence
}

findTable(example1)
    x   y     z
5 acc deb asset
6   2   3     1
7   3   2     1
8   4   5     2

findTable(example2)
    x   y     z    u   i    o
6 acc deb asset <NA> win lose
7   2   3     1 <NA>   2    2
8   3   2     1 <NA>   3    2
9   4   5     2 <NA>   1    1