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