2017-09-29 8 views
0

私はhome_goalaway_goalを使って新しい変数を作り、ゲームの結果を見ています。2人を比較して変数を作りようとしています

これは、私はそれが引き分け、すべてのゲームを与える

if(data$home_team_goal < data$away_team_goal){ 
    data$result <- c('H') 
}else if (data$home_team_goal > data$away_team_goal){ 
    data$result<- c('A') 
}else (data$home_team_goal == data$away_team_goal){ 
    data$result<- c('D') 
} 

を持っているものです。

+0

'if'を使用してそのように行全体をベクトル化しません。 「最初の要素のみが使用されている」という警告は表示されませんか?おそらく、最初の行の結果を取り出して、他の場所にコピーするだけです。 – Jul

+2

[Rのネストされたifelseステートメントの可能な複製](https://stackoverflow.com/questions/18012222/nested-ifelse-statement-in-r) –

答えて

2

はあなただけ>00または<0されている2つの列の間の差にラベルを希望している。この場合case_when

library(dplyr) 
data %>% 
    mutate(result = case_when(home_team_goal == away_team_goal~"D", 
           home_team_goal > away_team_goal ~ "H", 
           TRUE ~ "A")) 
# home_team_goal away_team_goal result 
#1    0    1  A 
#2    0    0  D 
#3    2    4  A 
#4    3    1  H 
#5    3    4  A 
#6    1    1  D 
2

ifelseステートメントでこれを行うことができます。そしてdplyrパッケージを使用すると、冗長$構文ではなく名前で列を参照するだけで、mutateを使用して新しい列を追加できます。また、dataはデータフレームの大きな名前ではありませんので、data1を使用しています。ここで

install.packages("dplyr") # if required 
library(dplyr) 

data1 <- data.frame(home_team_goal = c(0, 0, 2, 3, 3, 1), 
        away_team_goal = c(1, 0, 4, 1, 4, 1)) 

data1 %>% 
    mutate(result = ifelse(home_team_goal == away_team_goal, "D", 
        ifelse(home_team_goal > away_team_goal, "H", "A"))) 


    home_team_goal away_team_goal result 
1    0    1  A 
2    0    0  D 
3    2    4  A 
4    3    1  H 
5    3    4  A 
6    1    1  D 
+1

dplyrを使用している場合は、なぜ 'if_else'を使用しないのですか?私は信じているより速いです。 – thelatemail

1

とオプションです。それだけで1つの比較であり、複数のif/elseifelseまたはcase_whenをループするための必要はありません。

factor(with(data1, sign(home_team_goal - away_team_goal)), labels=c("A","D","H")) 
#[1] A D A H A D 
#Levels: A D H 

あなたがfactor出力したくない場合は、次の

c("A","D","H")[factor(with(data1, sign(home_team_goal - away_team_goal)))] 
#[1] "A" "D" "A" "H" "A" "D" 
関連する問題