1

最近 R を使い始めました。R のマニュアルはありますが、必要な関数が見つからないことがよくあります。これが私がつまずいた問題です。

私のデータは次のようになります。

col1    col2    col3
Alex    NA  URL
Mike    URL NA
John    URL URL
Peter   NA  NA
James   NA  URL

Col1 は常に一意のカテゴリ値になります。Col2 は、これらの人々が私の Web サイトにアクセスしているソースを表します (URL は、そこに URL 全体があることを意味し、http.www.facebook.com の可能性があります)。NA は、ユーザーがバイラルで私の Web サイトにアクセスしたことを意味します。Col3 は参照を表します (ユーザーがどこから来たかを示すもう 1 つの指標)。

私がする必要があるのは、次の条件に基づいて、col3 から col2 にデータを転送またはコピーすることです。 col2。col3 と col2 の両方に URL がある場合、そこで何も起こらないようにします。col 3 に NA があり、col2 に URL がある場合、何も変更したくありません。ここに目的の出力があります

col1    col2                    col3   
Alex    URL(copied from col3)   URL
Mike    URL(kept this URL)      NA
John    URL(kept this URL)      URL
Peter   NA(Kept NA)             NA
James   URL(copied from col3)   URL

SO、Alex と James は col3 から URL を取得し、John と Mike は col2 にあった最初の URL を保持し、Peter は NA を保持しました。

今、私はこのウェブサイトでさえもどこでも見ましたが、「IF」条件を使用してある列から別の列にデータをコピーすることについて何も見つけることができませんでした. 私が見つけた唯一のことは、「マージ」機能を使用して列全体をあるデータフレームから別のデータフレームにコピーする方法でしたが、それ以外には何もありませんでした。

これを達成できる機能はありますか?

4

1 に答える 1

3

あなたの例は再現できないので、自分でいくつか作成する必要があります:

dat = data.frame(name = sample(c("John", "James", "Peter"), size = 10, replace = TRUE),
                 source = sprintf("http://www.%s.com", sample(LETTERS, size = 10)),
                 referal = sprintf("http://www.%s.com", sample(LETTERS, size = 10)))
# Introduce some NA's
dat[c(1,3,9), "source"] <- NA
dat[c(2,7), "referal"] <- NA
> dat
    name           source          referal
1   John             <NA> http://www.W.com                          
2  James http://www.M.com             <NA>                          
3   John             <NA> http://www.Z.com                          
4  Peter http://www.J.com http://www.L.com                          
5  Peter http://www.L.com http://www.H.com                          
6  Peter http://www.T.com http://www.U.com                          
7  James http://www.E.com             <NA>                          
8  Peter http://www.K.com http://www.K.com                          
9  Peter             <NA> http://www.R.com                          
10 James http://www.Z.com http://www.N.com 

あなたが探している関数は呼び出されifelseます:

dat = within(dat, { 
      source = as.character(source)
      referal = as.character(referal)
      source = ifelse(is.na(source), referal, source) 
    } )
> dat
    name           source          referal
1   John http://www.W.com http://www.W.com                          
2  James http://www.M.com             <NA>                          
3   John http://www.Z.com http://www.Z.com                          
4  Peter http://www.J.com http://www.L.com                          
5  Peter http://www.L.com http://www.H.com                          
6  Peter http://www.T.com http://www.U.com                          
7  James http://www.E.com             <NA>                          
8  Peter http://www.K.com http://www.K.com                          
9  Peter http://www.R.com http://www.R.com                          
10 James http://www.Z.com http://www.N.com   
于 2012-11-16T13:51:20.950 に答える