合并数据帧值

时间:2016-12-11 15:59:28

标签: r dataframe merge

我想合并由重叠但由单独的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”。

提前谢谢!

2 个答案:

答案 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中。有两个注意事项。

  1. 任何不匹配都必须放弃c("color", "count")
  2. data.frames不能有因素。下面,我使用stringsAsFactors = FALSE
  3. 作为字符向量读取它们

    数据

    !is.na