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

时间:2011-03-30 14:13:59

标签: 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

我的所作所为:

 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")

我得到了什么:

[1] 1 2 3 4 5 6

我期望得到的结果:

[1] B A C E B D

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

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

DF2$D[match(DF1$B, DF2$C)]
[1] B A C E B D
Levels: A B C D E F

为简化列名称的简化,您可以在创建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"

答案 1 :(得分:4)

我认为您需要使用match()来获取DF1$BDF2$C的索引,然后使用它来索引DF2$D

DF2$D[match(DF1$B,DF2$C)]
[1] B A C E B D
Levels: A B C D E F

这是你的意思吗?