R 从同义列绑定行

R 从同义列绑定行,r,dplyr,tidyr,R,Dplyr,Tidyr,我正在导入许多不同的数据帧。由于现场工作人员使用不同的符号,一列有许多不同的同义词。当我将data.frames行绑定在一起时,这会产生一个问题,因为现在存在许多多余的列来描述相同的内容。有时它们只是拼错了。每次导入的列的顺序和数量各不相同 例如:PARCEL可以拼写为PAR、PARC、包裹等。 ROWNR可以拼写为ROW、ROWNUMBER等 示例数据: 字段1 X1 BLOCK PARCELL ROW SORTNR FUKTIGH PLANTNR KONDI SKADA1 SKADA2

我正在导入许多不同的数据帧。由于现场工作人员使用不同的符号,一列有许多不同的同义词。当我将data.frames行绑定在一起时,这会产生一个问题,因为现在存在许多多余的列来描述相同的内容。有时它们只是拼错了。每次导入的列的顺序和数量各不相同

例如:PARCEL可以拼写为PAR、PARC、包裹等。 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   
X1地块地块地块行SORTNR FUKTIGH PLANTNR KONDI SKADA1 SKADA2 SKADA3 OVRIGT X13
1钠11 13 3 1钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
2钠11 13 3 2钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
3 NA 11 13 3 1 NA NA NA NA NA
4Na1111343513NaNaNaNaNaNaNa
5 NA 11 13 3 5 1 NA NA NA NA NA
6 NA 11 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   
X1 BL PARC ROWNR SORTNR工厂DOD85 KOND HOJD SKAD1 SKAD2 X12
1 NA 111710187 NA NA NA
2 NA 11 17 2 0 1 83 NA NA NA
3 NA 11 17 3 0 1 67 NA NA NA
4 NA 11 17 4 0 1 77 NA NA NA
5 NA 11 17 5 0 150 151 NA
6NA 1171760159151 NA
当然,您可以在导入数据时手动解析每个文件的正确名称,或者使用dplyr::rename来解决这个问题,但是由于存在许多不同的导入,因此这变得不切实际

我已经在一个命名列表data.frame.list中拥有了我所有的data.frames,所以最好迭代这个:lappy,for

库(dplyr)

data.frame.list
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.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

谢谢你的回复。这很接近,但不是我想要的。我已经更新了我的问题,以更好地反映阅读您的答案时出现的问题。列的数量可能因导入而异,并且不总是以相同的顺序出现。请在您的问题中添加一些相关的示例数据,以便我可以相应地更新我的答案。谢谢您的答复。这很接近,但不是我想要的。我已经更新了我的问题,以更好地反映阅读您的答案时出现的问题。列的数量在导入之间可能会有所不同,并且不总是以相同的顺序出现。请在您的问题中添加一些相关的示例数据,以便我可以相应地更新我的答案。