将数据框中的某些列替换为另一个数据框中的列

时间:2020-04-29 08:05:40

标签: r dataframe

我有两个具有相同列名和相同大小的数据框。每个都有40列和5000行。我想将数据框中的某些列替换为其他df中由其公共ID排列的列。这两个df的列ID相同,但每个df的列ID不必相同。 让我提供一个例子来说明问题。

  df1 <- data.frame( ID = c("ID1", "ID2","ID3", "ID4","ID5", "ID6","ID7", "ID8", "ID9"),
                  A = c(1,2,3,4,5,6,7,8,9), 
                  B = c(11,21,31,41,51,61,71,81,91),
                  C = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
                  D = c("a1","b1","c1", "d1","e1", "f1", "g1", "h1", "i1")
)
df1

df2 <- data.frame( ID = c("ID2", "ID1","ID3", "ID4","ID5", "ID6","ID9", "ID8", "ID7"),
                   A = sample(x = 1:20, size = 9), 
                   B = sample(x = 1:50, size = 9),
                   C = c("A", "B", "C", "D", "E", "F", "G", "H", "I"),
                   D = c("A1","B1","C1", "D1","E1", "F1", "G1", "H1", "I1")
)
 df2

这应该是用df1中的列替换其列A,B之后的df2,同时保持其余列(C,D)不变。

df2_out <- data.frame( ID = c("ID2", "ID1","ID3", "ID4","ID5", "ID6","ID9", "ID8", "ID7"),
                   A = c(2,1,3,4,5,6,9,8,7), 
                   B = c(21,11,31,41,51,61,91,81,71),
                   C = c("A", "B", "C", "D", "E", "F", "G", "H", "I"),
                   D = c("A1","B1","C1", "D1","E1", "F1", "G1", "H1", "I1")
)

如上所述,我的数据集中要更改的列数很长(30): changes_columns <-c(“ A”,“ B”,....)

对如何制作有帮助吗? 谢谢

3 个答案:

答案 0 :(得分:2)

使用data.table软件包,您可以按照以下步骤解决问题:

  library(data.table)

  setDT(df2)[df1, c("A", "B") := .(i.A, i.B), on = "ID"]

  #     ID A  B C  D
  # 1: ID2 2 21 A A1
  # 2: ID1 1 11 B B1
  # 3: ID3 3 31 C C1
  # 4: ID4 4 41 D D1
  # 5: ID5 5 51 E E1
  # 6: ID6 6 61 F F1
  # 7: ID9 9 91 G G1
  # 8: ID8 8 81 H H1
  # 9: ID7 7 71 I I1

答案 1 :(得分:1)

使用merge + subset

的另一个基本R选项
df2_out <- subset(merge(df1[c("ID","A","B")],df2,all = TRUE,by = "ID"),select = -cbind(A.y,B.y))

这样

> df2_out
   ID A.x B.x C  D
1 ID1   1  11 B B1
2 ID2   2  21 A A1
3 ID3   3  31 C C1
4 ID4   4  41 D D1
5 ID5   5  51 E E1
6 ID6   6  61 F F1
7 ID7   7  71 I I1
8 ID8   8  81 H H1
9 ID9   9  91 G G1

答案 2 :(得分:0)

我们可以使用Chapter.objects.filter(id=id)获得match的顺序,并用ID中的changed_columns替换它们。

df1