假设我在R df
中有一个数据框,我正在尝试将Client1
,Client2
和Client3
数字(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*
匹配。
非常感谢!
答案 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;