2017-01-14 1 views
1

Rに新しい政治家 "i"が残っているかどうかを説明する新しい列を生成する方法を理解しようとしています。与えられた議会 "l"のための同じパーティーまたは欠陥。これらの政治家と政党は、インデックスのために認められています。期待される結果は以下のように表示されるはずですQ:2つの条件で行の値に基づいてdata.frameの新しい列を塗りつぶす方法R

## example of data 

names <- c("Jesus Martinez", "Anrita blabla", "Paco Pico", "Reiner Steingress", "Jesus Martinez Porras") 
Parti.affiliation <- c("Winner","Winner","Winner", "Loser", NA)#NA, "New party", "Loser", "Winner", NA 
Legislature <- c(rep(1, 5), rep(2,5), rep(3,5), rep(4,5), rep(5,5), rep(6,5)) 
selection <- c(rep("majority", 15), rep("PR", 15)) 
sex<- c("Male", "Female", "Male", "Female", "Male") 
Election<- c(rep(1955, 5), rep(1960, 5), rep(1965, 5), rep(1970,5), rep(1975,5), rep(1980,5)) 

d<- data.frame(names =factor(rep(names, 6)), party.affiliation = c(rep(Parti.affiliation,5), NA, "New party", "Loser", "Winner", NA), legislature = Legislature, selection = selection, gender =rep(sex, 6), Election.date = Election) 

## genrating id for politician and party.affiliation 

d$id_pers<- paste(d$names, sep="") 
d <- arrange(d, id_pers) 
d <- transform(d, id_pers = as.numeric(factor(id_pers))) 
d$party.affiliation1<- as.numeric(d$party.affiliation) 

::政治家は(コラム「id_pers」を通じて示した)コラム「party.affiliation1にそれらの値を変更した場合はここに私のデータは、もともとどのように見えるかの例です。

d["switch"]<- c(1, rep(0,4), NA, rep(0,6), rep(NA, 6),1, rep(0,5), rep (0,5),1) # 0= remains in the same party/1= switch party affiliation. 

としては:それ以外の場合は0が、同じ手順は、データセット内のすべての政治家で行わなければならないので、期待される結果は次のようであるべきで、スイッチ 『」、値1と呼ばれる新しい列に割り当てられます』例えば、このdata.frameで、最初の政治家、「Anrita blabla」が第1から第5議会の3の候補者であったことが分かります。しかし、「アリタ」は第六議会で党の所属を変えていることから、「2」の候補者であったことが分かります。したがって、新しい列「スイッチ」には、このAnritaの党所属の変更を反映する値「1」と、「Anrita」が最初の5つの立法府の党所属を変更しなかったことを示す「0」が含まれている必要があります。

私はこれを行うためのいくつかのアプローチ(例:ループ)を試みました。私はこの戦略の最も簡単なものを発見したが、それは動作しません:(

## add a new column based on raw values 
    ind <- c(FALSE, party.affiliation1[-1L]!= party.affiliation1[-length(party.affiliation1)] & party.affiliation1!= 'Null') 
    d <- d %>% group_by(id_pers) %>% mutate(this = ifelse(ind, 1, 0)) 

を私はあなたが事前にこの説明明確に感謝を願って!

答えて

1

を私はあなたができると思う:。

我々がもしあれば、以前は、政党が異なっていたかどうかについての情報を持っていないよう
library(tidyverse) 
d%>% 
    group_by(id_pers)%>% 
    mutate(switch=as.numeric((party.affiliation1-lag(party.affiliation1)!=0))) 

最初のエントリは、NAになります

編集:lag()default=パラメータを使用して、ifelse()をネストして最初の値を区別します。 data.tableを使用して

df=d%>% 
    group_by(id_pers)%>% 
    mutate(switch=ifelse((party.affiliation1-lag(party.affiliation1,default=-99))>90,99,ifelse(party.affiliation1-lag(party.affiliation1)!=0,1,0))) 
+0

Thanks Jaime Caffarel and @Haborymeそれにもかかわらず、あなたのコード行で、Rに「最初のエントリに値99を割り当てる」と言うことができるかどうかを聞かせてください。このようにして、私はそれらの本当の欠損値とその党の所属に関する情報を持っているそれらの事例を区別することができます。 =) –

+0

はい、私の編集を参照してください。 – Haboryme

+0

ありがとうございます!私はあなたの答えを短くて甘いものにしています:) –

1

別のアプローチ、:

library(data.table) 

# Convert to data.table 
d <- as.data.table(d) 

# Order by election date 
d <- d[order(Election.date)] 

# Get the previous affiliation, for each id_pers 
d[, previous_party_affiliation := shift(party.affiliation), by = id_pers] 

# If the current affiliation is different from the previous one, set to 1 
d[, switch := ifelse(party.affiliation != previous_party_affiliation, 1, 0)] 

# Remove the column 
d[, previous_party_affiliation := NULL] 

をHaborymeが指摘したように、それぞれの人の最初のエントリは、前回の選挙についての情報が不足しているためNAになります。そして、結果はこれを与える:

    names party.affiliation legislature selection gender Election.date id_pers party.affiliation1 switch 
1:   Anrita blabla   Winner   1 majority Female   1955  1     NA  NA 
2:   Anrita blabla   Winner   2 majority Female   1960  1     NA  0 
3:   Anrita blabla   Winner   3 majority Female   1965  1     NA  0 
4:   Anrita blabla   Winner   4  PR Female   1970  1     NA  0 
5:   Anrita blabla   Winner   5  PR Female   1975  1     NA  0 
6:   Anrita blabla   New party   6  PR Female   1980  1     NA  1 

(...)

あなたが使用することができ、政治的所属の最初のエントリを識別し、それらに値99を代入するために

編集しますこの変更されたバージョン:

# Note the "fill" parameter passed to the function shift 
d[, previous_party_affiliation := shift(party.affiliation, fill = "First"), by = id_pers] 

# Set 99 to the first occurrence 
d[, switch := ifelse(party.affiliation != previous_party_affiliation, ifelse(previous_party_affiliation == "First", 99, 1), 0)] 
+0

ありがとう@JaimeCaffarel !!それにもかかわらず、あなたはHaborymesの答えの下のコメントで私の質問に対する答えを見つけることができますか? –

+0

@Adriandelriorodriguez回答を更新しました –

+1

ありがとうございました!!!私はdata.tableパッケージを知らなかったので、私はあなたの投稿で多くを学んだ。それにもかかわらず、私はdplyr gramarにもっと慣れているので、私は他のオプションを使うだろう:)私はdata.tableパッケージを未来。もう一度、あなたの努力に感謝します! –

関連する問題