我有两个数据帧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)
我怎样才能做到这一点?
我认为你真正想要的是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)
| 归档时间: |
|
| 查看次数: |
1782 次 |
| 最近记录: |