使用数据帧将矢量的值设置为"键","值"对

oba*_*iro 2 r

我有两个数据帧DF1,DF2,每个数据帧有2个向量DF1 $ A DF1 $ B,DF2 $ C,DF3 $ D. 我需要扫描DF1中的每一行,如果DF1 $ B中的值等于DF2 $ C中的某个值,那么我需要在DF2 $ D中显示相应的值.

我试图用ifelse和%in%来解决这个问题而没有成功.我不明白为什么它不起作用.

我有:

DataFrame1 (DF1)
A   B   
10  2
11  1
13  3
15  5
25  2
45  4

DataFrameB (DF2)
C D
1 A
2 B
3 C
4 D
5 E
6 F
Run Code Online (Sandbox Code Playgroud)

我所做的:

 DF1 <- data.frame(c(10, 11, 13, 15, 25, 45), c(2, 1, 3, 5, 2, 4))
 DF2 <- data.frame( c(1, 2,3,4,5,6), c("A", "B", "C", "D", "E", "F"))
 names(DF1) <-c("A","B")
 names(DF2) <-c("C", "D")
 ifelse((DF1$B %in% DF2$C), DF2$D, "NA")
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

[1] 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)

我期望获得:

[1] B A C E B D
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

mds*_*ner 5

我认为你真正想要的是match():

DF2$D[match(DF1$B, DF2$C)]
[1] B A C E B D
Levels: A B C D E F
Run Code Online (Sandbox Code Playgroud)

要简化列名称的提供,可以在创建data.frame时执行此操作.另外,要获取字符而不是因子使用stringsAsFactors:

DF1 <- data.frame(A = c(10, 11, 13, 15, 25, 45), B = c(2, 1, 3, 5, 2, 4))
DF2 <- data.frame(C = c(1, 2,3,4,5,6), D = c("A", "B", "C", "D", "E", "F"), stringsAsFactors = FALSE)

DF2$D[match(DF1$B, DF2$C)]

[1] "B" "A" "C" "E" "B" "D"
Run Code Online (Sandbox Code Playgroud)