在给定ID号

时间:2015-08-06 20:24:50

标签: r replace match

假设我在R df中有一个数据框,我正在尝试将Client1Client2Client3数字(ID)替换为各自的{{1} }}。我知道name向量中的每个数字代表Client*给定name#。

id

如果有人知道会对框架执行以下更改的一系列命令,我将非常感激:

Client1 Client2 Client3 X Y Z id Name A B C
1       2       3       y n y 1  Jay  n y n
4       1       2       y n n 4  Jack n y n
2       10      5       y n n 2  Jill y y y
8       4       2       n n y 8  Ana  y y y

因此,Client1 Client2 Client3 X Y Z id Name A B C Jay Jill Tom y n y 1 Jay n y n Jack Jay Jill y n n 4 Jack n y n Jill Dan Wayne y n n 2 Jill y y y Ana Jack Jill n n y 8 Ana y y y 列与ID和Client*匹配。

非常感谢!

1 个答案:

答案 0 :(得分:3)

假设OP仅提供了示例数据的一小部分,并且在随后的行中提供匹配的'对于Dan',' Wayne'将被发现。

一个选项是match客户'使用' id'转换为matrix后原始数据集中的列' df1'的列。这将提供用于获取相应“姓名”的数字索引。数据集中的元素。输出可以分配回'客户端'使用'名称'

替换数字的列
  nm1 <- grep('^Client', colnames(df1))
  df1[nm1] <- df1$Name[match(as.matrix(df1[nm1]), df1$id)]
  df1
  #  Client1 Client2 Client3 X Y Z id  Name A B C
  #1     Jay    Jill     Tom y n y  1   Jay n y n
  #2    Jack     Jay    Jill y n n  4  Jack n y n
  #3    Jill     Dan   Wayne y n n  2  Jill y y y
  #4     Ana    Jack    Jill n n y  8   Ana y y y
  #5   Wayne     Tom     Jay n n y  5 Wayne n y n
  #6     Dan    Jack     Tom y n n 10   Dan y n y
  #7     Tom    Jack    Jill n y n  3   Tom n y y

数据

  df1 <- structure(list(Client1 = c(1L, 4L, 2L, 8L, 5L, 10L, 3L), 
  Client2 = c(2L, 
  1L, 10L, 4L, 3L, 4L, 4L), Client3 = c(3L, 2L, 5L, 2L, 1L, 3L, 
  2L), X = c("y", "y", "y", "n", "n", "y", "n"), Y = c("n", "n", 
  "n", "n", "n", "n", "y"), Z = c("y", "n", "n", "y", "y", "n", 
  "n"), id = c(1L, 4L, 2L, 8L, 5L, 10L, 3L), Name = c("Jay", "Jack", 
  "Jill", "Ana", "Wayne", "Dan", "Tom"), A = c("n", "n", "y", "y", 
  "n", "y", "n"), B = c("y", "y", "y", "y", "y", "n", "y"), C = c("n", 
  "n", "y", "y", "n", "y", "y")), .Names = c("Client1", "Client2", 
  "Client3", "X", "Y", "Z", "id", "Name", "A", "B", "C"),
   class = "data.frame", row.names = c(NA, -7L))

注意:添加了更多行以包含所有&#39;名称&#39;对应于&#39; <#39;