2011-12-16 12 views
1

私はこれについてどうやって行くのかかなり混乱しています。データフレームに2つの列があるとします。 1つの列は数値順(x)、もう一方は最初の数値か-1(y)を指定します。これらは、一致する実験の結果です。目標は、同じ個人の写真が複数あるかどうかを確認することです。下の例では10枚の写真がありますが、6枚は独特の写真です。 y列には、一致するものがあれば対応するxが報告されます。マッチしない場合、yは-1です(同様にNAsかもしれません)。 1人あたり2枚以上の写真がある場合、マッチ#は最新の記録になります(写真1,5,7は同じ個人です)。グループは写真が撮影された時間です(グループ内で一致するものはありません)。うまくいけば、私は右のこの例を持っている:2つの列を比較する:論理値は列2の列1の値ですか?

x <- c(1,2,3,4,5,6,7,8,9,10) 
y <- c(-1,-1,-1,-1,1,-1,1,-1,2,4) 
group <- c(1,1,1,2,2,2,3,3,3,3) 
DF <- data.frame(x,y,group) 

私はユニークな個人に名前を付けるために、新しい変数を作成し、個々ごとに単一の行で、最終的なデータセットを持っていると思います(つまり、唯一の6行の代わりに10を持っています)、グループ情報も含まれています。私。個人が3つすべてのグループに属している場合、「111」の値が存在する可能性があります。または、最初のグループと最後のグループの場合は「101」になります。任意のヒント?

結果のデータセットについて質問してくれてありがとう。私が与えた実際の数字に基づいてグループの説明が悪いことに気がついたので、結果を少し変更しました。ボーナスも持っているといいですが、重要ではありません。

name <- c(1,2,3,4,6,8) 
group_history <- as.character(c('111','101','100','011','010','001')) 
bonus <- as.character(c('1,5,7','2,9','3','4,10','6','8')) 
results_I_want <- data.frame(name,group_history,bonus) 

私の言葉、上記固定よりミス...

+0

のための別の解決策は、あなたがデータセットは、この例のためにどのように見えるかを追加してもらえますか? –

答えて

2

を(更新)の例を使用して、あなたは下に高い数値からマッピングを作成しxyを使用し

x <- c(1,2,3,4,5,6,7,8,9,10) 
y <- c(-1,-1,-1,-1,1,-1,1,-1,3,4) 
group <- c(1,1,1,2,2,2,3,3,3,3) 

DF <- data.frame(x,y,group) 

を与えました同じ人である数字。名前は文字列ですが、数字の文字列でもあります。

bottom.df <- DF[DF$y==-1,] 
mapdown.df <- DF[DF$y!=-1,] 
mapdown <- c(mapdown.df$y, bottom.df$x) 
names(mapdown) <- c(mapdown.df$x, bottom.df$x) 

我々は、それがダウンして最低数のすべてを取得するために取るので、whileループを使用する必要があります何回か分かりません。

oldx <- DF$x 
newx <- mapdown[as.character(oldx)] 
while(any(oldx != newx)) { 
    oldx = newx 
    newx = mapdown[as.character(oldx)] 
} 

結果は、それが属するグループで、そのセットの最小番号で名前が付けられます。

DF$id <- unname(newx) 

グループメンバーシップを取得するのが難しくなります。 reshape2を使用してこれをワイドフォーマット(グループごとに1つのカラム)に変換します。そのカラムには何かがある場合はカラムが "1"で、そうでない場合は "0"です。

library("reshape2") 

wide <- dcast(DF, id~group, value.var="id", 
       fun.aggregate=function(x){if(length(x)>0){"1"}else{"0"}}) 

最後に、これらの "0"/"1"メンバーシップをまとめて貼り付けて、説明したグループ化変数を取得します。

wide$grouping = apply(wide[,-1], 1, paste, collapse="") 

結果:

> wide 
    id 1 2 3 grouping 
1 1 1 1 1  111 
2 2 1 0 0  100 
3 3 1 0 1  101 
4 4 0 1 1  011 
5 6 0 1 0  010 
6 8 0 0 1  001 

はまだありません "ボーナス"。

EDIT:

ボーナス情報を取得するには、それはすべてのものを維持するためにマッピングをやり直すことができます。多くの場合、これは遅くなる可能性があります。

oldx/newx一部を置き換えます。

> wide 
    id 1 2 3 grouping bonus 
1 1 1 1 1  111 1,5,7 
2 2 1 0 0  100  2 
3 3 1 0 1  101 3,9 
4 4 0 1 1  011 4,10 
5 6 0 1 0  010  6 
6 8 0 0 1  001  8 

注このISN」:あなたが与える

bonus <- tapply(iterx[,1], iterx[,ncol(iterx)], paste, collapse=",") 
wide$bonus <- bonus[as.character(wide$id)] 

を使用することができ、特典データを生成するには

iterx <- matrix(DF$x, ncol=1) 
iterx <- cbind(iterx, mapdown[as.character(iterx[,1])]) 
while(any(iterx[,ncol(iterx)]!=iterx[,ncol(iterx)-1])) { 
    iterx <- cbind(iterx, mapdown[as.character(iterx[,ncol(iterx)])]) 
} 

DF$id <- iterx[,ncol(iterx)] 

あなたの出力例と同じですが、あなたの出力例が正しいとは思わない(どのようにあなたが "000" のgrouping_historyを持つことができますか?)

EDIT:

今では同意します。

+0

私はちょっとした間違いを修正しました:( – Nate

+0

幸いなことに、あなたはそれを正しく説明してしまう前に、私の問題を理解しました。 – Nate

1

ボーナス変数

f_bonus <- function(data=df){ 
    data_a <- subset(data,y== -1,select=x) 
    data_a$pos <- seq(nrow(data_a)) 
    data_b <- subset(df,y!= -1,select=c(x,y)) 
    data_b$pos <- match(data_b$y, data_a$x) 
    data_t <- rbind(data_a,data_b[-2]) 
    data_t <- with(data_t,tapply(x,pos,paste,sep="",collapse=",")) 
    return(data_t) 
} 
関連する問題