我有两个数据集。其中一个包含需要为内部系统重新格式化的内部数据
Internal Name 1 Internal Name 2 Internal Name 3
1234 abcd testing
4567 efgh testing
78910 ijkl 123
第二个数据集为空,只有列名。这是格式模板
Customer Name Reference Number
基本上,我需要将内部数据中的数据复制到格式模板中。一些列是不需要的,并且列的顺序是不同的;内部名称1";转到";参考号";
Customer Name Reference Number
abcd 1234
efgh 4567
ijkl 78910
我可以重命名列并删除不需要的列,但列的命名方式和顺序对内部系统很重要,所以我觉得以某种方式将数据复制到格式数据集中会更容易
我尝试过做一个简单的数据$Customer Name
=internaldata$Internal Name 1
,但我得到了一个行数不匹配的错误。每周收到的行数会有所不同,所以我不能只将其设置为特定值
我想如果你有一个像这样的空模板数据帧:
template <- data.frame('Customer Name' = character(),
'Reference Number' = character(),
check.names = FALSE)
还有一个问题中数据帧的可复制示例:
dat <- data.frame(`Internal Name 1` = c("1234", "4567", "78910"),
`Internal Name 2` = c("abcd", "efgh", "ijkl"),
`Internal Name 3` = c("testing", "testing", "123"),
check.names = FALSE)
然后你可以做以下操作:
library(dplyr)
full_join(template, dat,
by = c('Customer Name' = 'Internal Name 2',
'Reference Number' = 'Internal Name 1')) %>%
select(`Customer Name`, `Reference Number`)
#> Customer Name Reference Number
#> 1 abcd 1234
#> 2 efgh 4567
#> 3 ijkl 78910
如果将结果存储为template
,则使用新的dat
运行相同的代码将向现有数据添加任何新的客户信息。
您可以match
接收到内部名称为2的客户,该名称为内部数据帧中的行号。实际上不需要一个空模板。如果新名称未在内部记录,则会得到NA
。
## customers in arbitrary number and order
received <- c("ijkl", "abcd", "efgh", "ijkl", "abcd", "efgh", 'nomatch')
newdat <- data.frame(Customer.Name=received,
Reference.Number=with(intern, Internal.Name.1[match(received, Internal.Name.2)]))
newdat
# Customer.Name Reference.Number
# 1 ijkl 78910
# 2 abcd 1234
# 3 efgh 4567
# 4 ijkl 78910
# 5 abcd 1234
# 6 efgh 4567
# 7 nomatch NA