我想合并由重叠但由单独的tsv文件组成的2个数据帧。 FileA是主列表,FileB包含主列表的一部分,但有许多更新的校对字段。目标是更新FileA中文件B不同的字段。 样本数据:
filea <-data.frame('ID'=c('555555','66532','333221','333333','545678'),
'color'=c('red','blaackk','green','green','oops'),
'count'=c(1,2,300,4,1))
fileb <- data.frame('ID'=c('555555','66532','333221','444333'),
'color'=c('red','black','green','green'),
'count'=c(1,2,3,4))
输出应该将“blaackk”更正为55532的“黑色”,但“oops”应该保留,因为它不在fileB中。计数“300”应为“3”。
提前谢谢!
答案 0 :(得分:1)
似乎是** (exit) exited in: :gen_server.call(MyApp.Repo.Pool, {:checkout, #Reference<0.0.1.11>, true}, 5000)
** (EXIT) no process
:erlang.send(MyApp.Repo.Pool, {:"$gen_cast", {:cancel_waiting, #Reference<0.0.1.11>}}, [:noconnect])
(stdlib) gen_server.erl:416: :gen_server.do_send/2
(stdlib) gen_server.erl:232: :gen_server.do_cast/2
src/poolboy.erl:58: :poolboy.checkout/3
(stdlib) timer.erl:197: :timer.tc/3
lib/mongo/pool/poolboy.ex:33: Mongo.Pool.Poolboy.run/2
lib/mongo/pool.ex:142: Mongo.Pool.run_with_log/5
lib/mongo.ex:220: Mongo.insert_one/4
lib/mongo_ecto/connection.ex:124: Mongo.Ecto.Connection.catch_constraint_errors/1
lib/mongo_ecto.ex:522: Mongo.Ecto.insert/6
lib/ecto/repo/model.ex:253: Ecto.Repo.Model.apply/4
lib/ecto/repo/model.ex:83: anonymous fn/10 in Ecto.Repo.Model.do_insert/4
lib/ecto/repo/model.ex:14: Ecto.Repo.Model.insert!/4
的一个很好的用例,它根据传递给它的顺序优先考虑从向量中选择值。您可以通过coalesce
列加入这两个表,并使用ID
函数从coalesce()
中选择颜色和计数列,除非相应的记录不存在:
fileb
或者更有效的方法是使用library(dplyr)
filea %>%
left_join(fileb, by = "ID") %>%
mutate(color = coalesce(color.y, color.x),
count = coalesce(count.y, count.x)) %>%
select(-matches("\\.[xy]"))
# ID color count
#1 555555 red 1
#2 66532 black 2
#3 333221 green 3
#4 333333 green 4
#5 545678 oops 1
包:
data.table
数据:
setDT(filea)
setDT(fileb)
filea
# ID color count
#1: 555555 red 1
#2: 66532 blaackk 2
#3: 333221 green 300
#4: 333333 green 4
#5: 545678 oops 1
filea[fileb, `:=`(count = i.count, color = i.color), on = "ID"][]
# ID color count
#1: 555555 red 1
#2: 66532 black 2
#3: 333221 green 3
#4: 333333 green 4
#5: 545678 oops 1
答案 1 :(得分:1)
以下是使用match
的基本R解决方案,该解决方案用于返回替换行的行索引以及替换行。
filea[!is.na(match(filea$ID, fileb$ID)), names(filea)[-1]] <-
fileb[!is.na(match(fileb$ID, filea$ID)), names(fileb)[-1]]
filea
ID color count
1 555555 red 1
2 66532 black 2
3 333221 green 3
4 333333 green 4
5 545678 oops 1
为简洁起见,我使用了names(filea)[-1]
来返回替换中涉及的data.frame的列,但您可能希望使用{{1}中的实际名称向量}。这是更具体的,允许您指定列的顺序或特定子集,以防它们未在data.frames之间对齐,或者在一个data.frame中有一些不在另一个data.frame中。有两个注意事项。
c("color", "count")
数据强>
!is.na