Связывание строк из синонимичных столбцов - PullRequest
1 голос
/ 03 октября 2019

Я импортирую много разных фреймов данных. Из-за того, что полевые работники используют разные обозначения, в столбце много разных синонимов. Это создает проблему, когда я связываю строки data.frames вместе, так как теперь существует много лишних столбцов для описания одного и того же. Иногда они просто ошибаются. Порядок и количество столбцов в каждом импорте различаются.

Например: PARCELL может быть написано PAR, PARC, PARCEL и т. Д. ROWNR может быть написано ROW, ROWNUMBER и т. Д.

Пример данных:

Поле 1

X1    BLOCK PARCELL ROW SORTNR FUKTIGH PLANTNR KONDI SKADA1 SKADA2 SKADA3 OVRIGT X13  
  <lgl> <dbl>   <dbl> <dbl>  <dbl>   <dbl>   <dbl> <dbl>  <dbl>  <dbl>  <dbl> <chr>  <lgl>
1 NA        1       1     1     13       3       1     1     NA     NA     NA NA     NA   
2 NA        1       1     1     13       3       2     1     NA     NA     NA NA     NA   
3 NA        1       1     1     13       3       3     1     NA     NA     NA NA     NA   
4 NA        1       1     1     13       3       4     3    513     NA     NA NA     NA   
5 NA        1       1     1     13       3       5     1     NA     NA     NA NA     NA   
6 NA        1       1     1     13       3       6     1     NA     NA     NA NA     NA   

Поле 2

  X1    BL PARC ROWNR SORTNR PLANTNR DOD85  KOND  HOJD SKAD1 SKAD2 X12  
  <lgl> <dbl>   <dbl> <dbl>  <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl>
1 NA        1       1     1     17       1     0     1    87    NA    NA NA   
2 NA        1       1     1     17       2     0     1    83    NA    NA NA   
3 NA        1       1     1     17       3     0     1    67    NA    NA NA   
4 NA        1       1     1     17       4     0     1    77    NA    NA NA   
5 NA        1       1     1     17       5     0     1    50   151    NA NA   
6 NA        1       1     1     17       6     0     1    59   151    NA NA   

Конечно,вы можете обойти это, вручную анализируя каждое правильное имя при импорте данных, или используя dplyr :: rename, но, поскольку существует много разных типов импорта, это становится непрактичным.

У меня уже есть все мои data.frames вименованный список, data.frame.list, так что, возможно, было бы неплохо повторить это: lapply, for?

library(dplyr)

data.frame.list <- mget(ls(pattern="^F"))
finaldf <- data.frame.list %>% bind_rows(.id="id")

Я бы хотел иметь возможность предоставить R некоторые идентифицированные синонимы перед привязкой строк, чтобы можно было избежать ручной корректировки их для каждого элемента данных.

Мой ожидаемыйвывод будет выглядеть следующим образом:

PARCEL;ROWNR;

1; 1

1; 2

1; 3

1; 4

2; 1

2; 2

2; 3

Я не заинтересован в отслеживании того, как оригинальный полевой работник записал участок или строку. Меня интересует только наличие значений в правильном столбце.

TLDR;Хотите объединить данные со многими ошибочными столбцами, предпочтительно путем итерации привязки строк по списку и синтаксического анализа синонимов для объединения в один столбец - например,

PARCEL = c ("PAR", "PA", "PARCELL","PARCEL")

ROW = c ("ROW", "Row", "ROWNR", "ROWNUMBER")

1 Ответ

0 голосов
/ 03 октября 2019

data.table::rbindlist() может быть тем, что вы ищете .. Хотя я не уверен из-за отсутствия выборочных данных и желаемого выходного примера.

обновленный ответ на основе предоставленных выборочных данных

dt1 <- fread("
X1    BLOCK PARCELL ROW SORTNR FUKTIGH PLANTNR KONDI SKADA1 SKADA2 SKADA3 OVRIGT X13  
NA        1       1     1     13       3       1     1     NA     NA     NA NA     NA   
NA        1       1     1     13       3       2     1     NA     NA     NA NA     NA   
NA        1       1     1     13       3       3     1     NA     NA     NA NA     NA   
NA        1       1     1     13       3       4     3    513     NA     NA NA     NA   
NA        1       1     1     13       3       5     1     NA     NA     NA NA     NA   
NA        1       1     1     13       3       6     1     NA     NA     NA NA     NA")

dt2 <- fread("
X1    BL PARC ROWNR SORTNR PLANTNR DOD85  KOND  HOJD SKAD1 SKAD2 X12  
NA        1       1     1     17       1     0     1    87    NA    NA NA   
NA        1       1     1     17       2     0     1    83    NA    NA NA   
NA        1       1     1     17       3     0     1    67    NA    NA NA   
NA        1       1     1     17       4     0     1    77    NA    NA NA   
NA        1       1     1     17       5     0     1    50   151    NA NA   
NA        1       1     1     17       6     0     1    59   151    NA NA")

l <- mget( ls (pattern = "^dt"))

#only keep columns with names that possibly contain parcels
PARCEL = c("PAR", "PA", "PARCELL", "PARCEL")
ROW    = c("ROW", "Row", "ROWNR", "ROWNUMBER")

l2 <- lapply( l, function(x) {
  rows    <- x[, grepl( paste0( ROW, collapse = "|" ), names(x) ), with = FALSE]
  parcels <- x[, grepl( paste0( PARCEL, collapse = "|" ), names(x) ), with = FALSE]
  ans <- data.table( row = rows, parcel = parcels )
  setnames( ans, names(ans), c("row", "parcel"))
  return(ans)
})

rbindlist( l2, use.names = FALSE, idcol = TRUE)

#    .id row parcel
# 1: dt1   1      1
# 2: dt1   1      1
# 3: dt1   1      1
# 4: dt1   1      1
# 5: dt1   1      1
# 6: dt1   1      1
# 7: dt2   1      1
# 8: dt2   1      1
# 9: dt2   1      1
# 10:dt2   1      1
# 11:dt2   1      1
# 12:dt2   1      1

старый ответ

Этот код работает до тех пор, пока столбцы в data.frames / data.tables в l всегда находятся втот же порядок.

library(data.table)

dt1 <- data.table( parcel = 1:2 )
dt2 <- data.table( parcell = 1:2 )

l <- mget( ls( pattern = "^dt" ) )

rbindlist( l, use.names = FALSE, idcol = "object" )

#    object parcel
# 1:    dt1      1
# 2:    dt1      2
# 3:    dt2      1
# 4:    dt2      2
...