我有兩個資料框,x 和 y。對于 的每個值x[,2],我查看該值是否等于 的元素的值y[,1]。如果是這樣,我在第一個資料框中添加第三列,其中包含 的值y[,2]。
我設法用回圈來做到這一點,但我怎么能用向量來做到這一點?
x=data.frame(1:15,15:1)
y=data.frame(3:5,c(7.2,8.5,0.3))
for ( i in 1:nrow(x)) {
for (j in 1:nrow(y)) {
if (x[i,2]==y[j,1]){
x[i,3]=y[j,2]
}else{
}
}
}
uj5u.com熱心網友回復:
使用連接而不是回圈 - 基于回圈比較,“x”的第二列與“y”的第一列進行比較,因此這些on列:=用于在第一個資料中創建新列“col3”的第二個資料集
library(data.table)
setDT(x)[y, col3 := i.col2, on = .(col2 = col1)]
-輸出
> x
col1 col2 col3
1: 1 15 NA
2: 2 14 NA
3: 3 13 NA
4: 4 12 NA
5: 5 11 NA
6: 6 10 NA
7: 7 9 NA
8: 8 8 NA
9: 9 7 NA
10: 10 6 NA
11: 11 5 0.3
12: 12 4 8.5
13: 13 3 7.2
14: 14 2 NA
15: 15 1 NA
資料
x <- data.frame(col1 = 1:15, col2 = 15:1)
y <- data.frame(col1 = 3:5, col2 = c(7.2,8.5,0.3))
uj5u.com熱心網友回復:
更新:非常感謝@TrainingPizza(他讓我注意到我的第一個答案的錯誤輸出,并提供了它的作業原理:
library(dplyr)
x %>%
rowwise() %>%
mutate(col3 = ifelse(col2 %in% y$col1, y$col2[y$col1==col2], NA))
col1 col2 col3
<int> <int> <dbl>
1 1 15 NA
2 2 14 NA
3 3 13 NA
4 4 12 NA
5 5 11 NA
6 6 10 NA
7 7 9 NA
8 8 8 NA
9 9 7 NA
10 10 6 NA
11 11 5 0.3
12 12 4 8.5
13 13 3 7.2
14 14 2 NA
15 15 1 NA
第一個答案(不正確)
這是dplyr避免 for - 回圈的方法:
library(dplyr)
x %>%
mutate(V3 = ifelse(V2 %in% y$V1, y$V2, NA))
V1 V2 V3
1 1 15 NA
2 2 14 NA
3 3 13 NA
4 4 12 NA
5 5 11 NA
6 6 10 NA
7 7 9 NA
8 8 8 NA
9 9 7 NA
10 10 6 NA
11 11 5 8.5
12 12 4 0.3
13 13 3 7.2
14 14 2 NA
15 15 1 NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411593.html
標籤:
