2017-12-13 5 views
1

Ich habe zwei Datenrahmen beteiligt: ​​dplyr: case_when vielen Fällen

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 

Ich möchte eine neue Spalte in data1 a3 während passenden a1 Informationen Daten2 zB wenn a1 = „e“ dann a3 genannt erstellen = "Bereich 1", wenn a1 = "d" dann a3 = "Bereich 5" und so weiter. Die neue data1 sollte wie folgt aussehen:

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 

ich diese

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

Das Problem ist, erreichen können, indem Sie, dass ich viele Fälle haben, und ich bin dies auf eine Reihe von Datenrahmen wiederholen mit unterschiedlichen Fälle.

Ich kann dies mit der Basis r tun, indem

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] 
    } 
    } 
} 

schreiben, aber ich bin ein Spaß dplyr. Jede Hilfe, wie dies mit dplyr erreicht werden kann, wird geschätzt.

Antwort

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

Sieht so aus, als ob Sie in diesem Fall wirklich nur einen Join machen. Sie können

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 

tun Und wenn Sie über das Umbenennen der Spalte Pflege oder nur eine bestimmte Spalte von Daten2 verschmelzen, wenn es mehr hat, könnte man

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

Diese Lösung, nicht dplyr::case_when() tun verwenden, aber es verwendet eine andere dplyr Funktion. Anstatt die zweite Tabelle zu verwenden, um Ihre case_when() zu schreiben, können Sie einfach die Tabelle beitreten und dann die Variable mit dplyr::rename() umbenennen.


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 
Verwandte Themen