2017-02-02 10 views
2

を条件変動要因を変異させるdplyrを使用して、私は次のような構造を持つ他のチームに対して、スポーツチーム、追跡勝利/損失からのデータを持っている:数値変数

Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss ... 
1 1   0   1  NA  NA  NA 
2 1   1   NA  NA  NA  1 
3 2   1   NA  NA  1  NA 
4 2   2   NA  1   NA  NA 
5 3   2   NA  NA  1  NA 
... 

を私はチームを含ん因子変数を作成したいですゲームは、データが次のようになりますようにと対戦しました:

Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss Team 
1 1   0   1  NA  NA  NA  Team1 
2 1   1   NA  NA  NA  1   Team2 
3 2   1   NA  NA  1  NA  Team2 
4 2   2   NA  1   NA  NA  Team1 
5 3   2   NA  NA  1  NA  Team2 
... 

私の思考(NOT実行可能コード)が、本質的にこれです:

if (Team1Win == 1 | Team1Loss == 1), Team = "Team1" 
if (Team2Win == 1 | Team2Loss == 1), Team = "Team2" 

私は本当に突然変異を使用してこれを行う方法に苦労しています。私はifelse、recodeなどでさまざまなアプローチを試みましたが、私は自分が望むものではないエラーや結果を得続けています。

dplyrでこの作業を行うには、正確かつ最も効率的な方法はありますか?

+0

'変異させる(チーム= ifelse(is.na(Team1Win)&is.na(Team1Loss)、 "Team2"、 "Team1"))' – Vlo

+0

@にVLOの素敵なコメントを追加します:[ ' ifelse'](http://stat.ethz.ch/R-manual/R-devel/library/base/html/ifelse。html)関数は、このタイプのユースケースのための素晴らしいものです – bouncyball

+0

@Vlo、それは私が投稿する前に試したことの一つです(私は欠けている値で試してみました。 "エラーがmutate_impl(.data、dots)にあります: 引数が" yes "で、デフォルトはありません"何が問題なのでしょうか? –

答えて

1

が、いくつかの有用な変化に:ちょうど罰金gather

  • sub作品に

    • na.rm = TRUEstringr
    • は必要に従ってフルデータが含まれていません目標はfull_joinです
    library(dplyr) 
    library(tidyr) 
    
    df = read.delim(text = 
    "Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss 
    1 1 0 1 NA NA NA 
    2 1 1 NA NA NA 1 
    3 2 1 NA NA 1 NA 
    4 2 2 NA 1 NA NA 
    5 3 2 NA NA 1 NA", sep = " ") 
    
    df %>% 
        select(-starts_with("Total")) %>% 
        gather(Team, one, -Game, na.rm = TRUE) %>% 
        select(-one) %>% 
        mutate(Team = sub("Win|Loss", "", Team)) %>% 
        full_join(df, .) 
    
    #> Joining, by = "Game" 
    #> Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss Team 
    #> 1 1   1   0  1  NA  NA  NA Team1 
    #> 2 2   1   1  NA  NA  NA   1 Team2 
    #> 3 3   2   1  NA  NA  1  NA Team2 
    #> 4 4   2   2  NA   1  NA  NA Team1 
    #> 5 5   3   2  NA  NA  1  NA Team2 
    
  • 0

    これはあなたが探しているものである可能性があります。

    x = colnames(df) 
    df$team<- NA 
    
    for (i in 1:nrow(df)) 
    { 
    df$team[i] = x[which(df[i,]==1)] 
    } 
    

    そして最後に、あなたがトリム「勝つ」ことができ、以下の機能を使用して「損失」:

    # solution 1 : 
    paste0("Team",ceiling(apply(df[-c(1:3)], 1, function(x) which(!is.na(x)))/2)) 
    [1] "Team1" "Team2" "Team2" "Team1" "Team2" 
    
    # solution 2: using a apply() {basically a for loop itself] 
    apply(df[-c(1:3)], 1, function(x) gsub("(Team\\d)+.*", "\\1", colnames(df[-c(1:3)])[which(!is.na(x))])) 
    # [1] "Team1" "Team2" "Team2" "Team1" "Team2" 
    
    # solution 3: (long route to dplyr) [ you have indirectly taught me a lot in dplyr through my search for this solution] 
    func <- function(x){ 
        y = which(x == 1)    # get the location of where 1 appears 
        z = rep(0, times = length(x)) # create a vector of 0's+location of 1 
        z[y] = y      # i.e. c(0,0,3,0,5) for Team2Win 
        z 
    } 
    
    df1 = df[-c(1:3)] %>% gather("key", "value", starts_with("Team")) %>% 
           group_by(key) %>% 
           dplyr::mutate(x = func(value)) %>% 
           filter(x != 0) %>% arrange(x) %>% select(key) 
    
    df$newcol = gsub("(Team\\d+).*", "\\1", df1$key) 
    
    +0

    @AshLevittあなたの質問に答えて私たちの努力を大切にしてください:appreicated http://stackoverflow.com/help/someone-answers –

    0

    あなたが単純なループを使用してそれを行うことができます(わずか2チームのためにハードコードされていません)。

    df$team<- gsub("win", "",df$team) 
    df$team<- gsub("loss", "",df$team) 
    
    1

    私はあなたが持っているかもしれませんしかし、多くのチームにまで及ぶdplyrを使用してソリューションを提供しますので、私は現時点では、物事へdplyrアプローチのための吸盤です。また、tidyrstringrを以下のapomのコメントで指摘されているように使います。

    library(dplyr) 
    library(tidyr) 
    library(stringr) 
    
    df = read_delim(
    "Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss 
    1 1 0 1 NA NA NA 
    2 1 1 NA NA NA 1 
    3 2 1 NA NA 1 NA 
    4 2 2 NA 1 NA NA 
    5 3 2 NA NA 1 NA",delim = " ") 
    
    df %>% 
        gather("Team",value,contains("Team")) %>% 
        filter(!is.na(value)) %>% 
        mutate(Team = str_replace_all(Team,c("Win" = "","Loss" = ""))) %>% 
        select(-value) 
    
    +2

    あなたは 'library(tidyr)' –

    +0

    @apomがよく目に入っていますが修正します – jamieRowen

    +0

    ありがとう!これは参考になります。 –

    0

    あなたのデータには2つ以上のチームがあり、チーム名は一般的ではありません。あなたがしたいのは、長い形式のデータを最初に作り直し、関連するチーム名を抽出することです。だから、次のように進めたいと思うかもしれません。

    library(dplyr) 
    library(tidyr) 
    new_df <- df %>% 
        gather(team,idx,Team1Win:Team100Loss) %>% 
        filter(!is.na(idx)) %>% 
        select(-idx) %>% 
        mutate(team = gsub("Win|Loss","",team)) 
    

    これらの幅の広い列を保持したい場合は、新しいDFを古いものと結合することができます。他の回答に似た線に沿って

    +0

    私はこれが私の答えにかなり似ているように感じます – jamieRowen

    +0

    私はそれを入れたときにあなたを見ませんでした。 – Julius