我有两个数据帧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
我怎样才能做到这一点?
答案 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$B
中DF2$C
的索引,然后使用它来索引DF2$D
:
DF2$D[match(DF1$B,DF2$C)]
[1] B A C E B D
Levels: A B C D E F
这是你的意思吗?