2017-12-13 4 views
1

私は2つのデータフレームを持っているが関与case_when:dplyr:多くの場合

set.seed(002) 
data1 <- data.frame(cbind(
    a1 = sample(letters, 8, replace = TRUE), 
    a2 = rpois(8, 10) 
), stringsAsFactors = FALSE) 

data2 <- data.frame(cbind(
    b1 = paste("area", 1:6, sep = " "), 
    b2 = c("e", "s", "o", "y", "d", "v") 
), stringsAsFactors = FALSE) 

data1 
    a1 a2 
1 e 9 
2 s 10 
3 o 12 
4 e 9 
5 y 16 
6 y 9 
7 d 11 
8 v 13 

data2 
     b1 b2 
1 area 1 e 
2 area 2 s 
3 area 3 o 
4 area 4 y 
5 area 5 d 
6 area 6 v 

私はDATA2の例からの情報でA1をマッチングしながら、a3を呼ばDATA1で新しい列を作成する場合は、A1 =「E」その後、A3 = "領域1"、a1 = "d"の場合、a3 = "領域5"などとなります。私は、問題は、私は多くの例を持っていると私は違うとデータフレームの数でこれを繰り返すだということである

data1 %>% 
    mutate(a3 = case_when(
    a1 == "e" ~ "area 1", 
    a1 == "s" ~ "area 2", 
    a1 == "o" ~ "area 3", 
    a1 == "y" ~ "area 4", 
    a1 == "d" ~ "area 5", 
    TRUE ~ "area 6" 
)) 

をすることによって、これを達成することができます

a1 a2  a3 
1 e 9 area 1 
2 s 10 area 2 
3 o 12 area 3 
4 e 9 area 1 
5 y 16 area 4 
6 y 9 area 4 
7 d 11 area 5 
8 v 13 area 6 

:新しいDATA1は次のようになります。ケース。

私は

data1$a3 <- NA 
for(i in 1:nrow(data2)){ 
    for(j in 1:nrow(data1)){ 
    if(data1[j,1] == data2[i,2]){ 
     data1[j,3] <- data2[i,1] 
    } 
    } 
} 

を書き込むことによって、ベースRでこれを行うことができますが、私はdplyrの楽しみです。 dplyrを使用してこれを達成する方法についてのご支援をいただければ幸いです。

答えて

0
data1 <- dplyr::left_join(data1, data2, by = c("a1" = "b2")) 

DATA1: -

a1 a2  b1 
e 9 area 1 
s 10 area 2 
o 12 area 3 
e 9 area 1 
y 16 area 4 
y 9 area 4 
d 11 area 5 
v 13 area 6 
0

あなたは本当にそのような場合に参加するように見えます。あなたは

left_join(data1, data2, by=c("a1"="b2")) 
# a1 a2  b1 
# 1 e 9 area 1 
# 2 s 10 area 2 
# 3 o 12 area 3 
# 4 e 9 area 1 
# 5 y 16 area 4 
# 6 y 9 area 4 
# 7 d 11 area 5 
# 8 v 13 area 6 

を行うことができますし、DATA2から列の名前を変更するか、1つの特定の列をマージ心配している場合、それはより多くを持っているとき、あなたはこのソリューションはdplyr::case_when()を使用していない

left_join(data1, data2 %>% select(a1=b2, a3=b1)) 
0

を行うことができますが、別のdplyr機能を使用します。 2番目のテーブルを使用してcase_when()を書き込む代わりに、テーブルを結合してdplyr::rename()を使用して変数の名前を変更するだけで済みます。


library(dplyr) 
#> 
#> Attaching package: 'dplyr' 
#> The following objects are masked from 'package:stats': 
#> 
#>  filter, lag 
#> The following objects are masked from 'package:base': 
#> 
#>  intersect, setdiff, setequal, union 
set.seed(2) 
data1 <- data.frame(cbind(a1 = sample(letters, 8, replace = TRUE), a2 = rpois(8, 
    10)), stringsAsFactors = FALSE) 

data2 <- data.frame(cbind(b1 = paste("area", 1:6, sep = " "), b2 = c("e", "s", 
    "o", "y", "d", "v")), stringsAsFactors = FALSE) 

data1 %>% left_join(data2, by = c(a1 = "b2")) %>% rename(a3 = b1) 
#> a1 a2  a3 
#> 1 e 9 area 1 
#> 2 s 10 area 2 
#> 3 o 12 area 3 
#> 4 e 9 area 1 
#> 5 y 16 area 4 
#> 6 y 9 area 4 
#> 7 d 11 area 5 
#> 8 v 13 area 6 
関連する問題