绑定同义列中的行

时间:2019-10-03 07:55:09

标签: r dplyr tidyr

我要导入很多不同的数据框。由于现场工作人员使用不同的符号,因此列有许多不同的同义词。当我将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,用于吗?

library(dplyr)

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

我希望能够在行绑定之前为R提供一些已标识的同义词,从而避免为每个data.frame单独手动校正这些同义词。

我的预期输出如下:

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 :(得分:0)

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

旧答案

只要l中data.frames / data.tables中的列始终保持相同的顺序,此代码就起作用。

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