2016-12-06 9 views
1

私は未知の長さの3つのデータフレームを持っています。各行A1、A2、B1、B3のためのものであることR:1データフレームと異なる長さの2つの他のデータフレームを比較する

B1 B2 n 
1 3 4 1 
2 4 1 2 
3 1 3 3 

注:データフレームBは次のようになり、同様に

A1 A2 n 
1 1 2 1 
2 3 2 2 
3 2 4 3 

データフレームAは次のようになりすべてが異なり、1~4の数字を構成します。

最後に、データフレームC

C1の値が全てであること
n C1 
1 1 3 
2 1 1 
3 1 4 
4 2 0 
5 2 2 
6 2 3 
7 3 3 
8 3 0 
9 3 1 

0〜4 n列は、すべてのデータ・フレームを接続します。私がしたいのは、C1の値がAデータフレーム、またはBにあり、これがそれぞれnであることを確認することです。それをC1のdiretclyと置き換えてください。値が0の場合は0になります。これは私が期待している結果です:

n C1 
1 1 B 
2 1 A 
3 1 B 
4 2 0 
5 2 A 
6 2 A 
7 3 B 
8 3 0 
9 3 B 

どのようにすればいいですか?あなたのご意見ありがとうございます。

答えて

2

これはひとつのアイデアです。最初の2つのデータフレームは、最初にmergeです。 mergeになったら、stackすべての列で新しいデータフレームを作成できるようになりました(nを除く)。 (我々の場合にはdf5)この新しいデータフレームを作成することによって、私たちできるようになりましたmatchn貼り付け - あなたの第3データフレームからC1(私たちの場合はdf4) - nを貼り付けるとdf5からvalueを。単純なgsub操作では、一致した値から文字だけが抽出されます。最後のステップとして、我々は0

df_all <- merge(df2, df3, by = 'n') 
# n A1 A2 B1 B2 
#1 1 1 2 3 4 
#2 2 3 2 4 1 
#3 3 2 4 1 3 

df5 <- data.frame(n = 1:nrow(df_all), stack(df_all[-1]), stringsAsFactors = FALSE) 
#head(df5) 
# n values ind 
#1 1  1 A1 
#2 2  3 A1 
#3 3  2 A1 
#4 1  2 A2 
#5 2  2 A2 
#6 3  4 A2 
ind <- gsub('\\d+', '', df5$ind)[match(do.call(paste, df4), do.call(paste, df5[-3]))] 
ind[is.na(ind)] <- 0 
ind 
#[1] "B" "A" "B" "0" "A" "A" "B" "0" "B" 
2

相互NASに設定し、わずかに異なるアプローチが、そのはに等しい加入によって追加された列を見つけ、最初CAB両方を外部結合左にありますC1

## Do the left outer joins with merge by n and all.x=TRUE 
out <- merge(merge(C,A,by="n",all.x=TRUE),B,by="n",all.x=TRUE) 
## Loop over rows and extract the name of the column whose value matches C1 
## first define a function to do so 
extract.name <- function(i,out) { 
    j <- which(out$C1[i]==out[i,3:ncol(out)]) 
    if (length(j)==0) return("0") else return(substr(colnames(out)[j[1]+2],1,1))      
} 
## Then, apply it to all rows 
out$C1 <- sapply(1:nrow(out),extract.name,out) 
## Keep only the n and C1 columns as output 
out <- out[,1:2] 
## n C1 
##1 1 B 
##2 1 A 
##3 1 B 
##4 2 0 
##5 2 A 
##6 2 A 
##7 3 B 
##8 3 0 
##9 3 B 

データ:

A <- structure(list(A1 = c(1L, 3L, 2L), A2 = c(2L, 2L, 4L), n = 1:3), .Names = c("A1", 
"A2", "n"), class = "data.frame", row.names = c("1", "2", "3" 
)) 
## A1 A2 n 
##1 1 2 1 
##2 3 2 2 
##3 2 4 3 

B <- structure(list(B1 = c(3L, 4L, 1L), B2 = c(4L, 1L, 3L), n = 1:3), .Names = c("B1", 
"B2", "n"), class = "data.frame", row.names = c("1", "2", "3" 
)) 
## B1 B2 n 
##1 3 4 1 
##2 4 1 2 
##3 1 3 3 

C <- structure(list(n = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), C1 = c(3L, 
1L, 4L, 0L, 2L, 3L, 3L, 0L, 1L)), .Names = c("n", "C1"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9")) 
## n C1 
##1 1 3 
##2 1 1 
##3 1 4 
##4 2 0 
##5 2 2 
##6 2 3 
##7 3 3 
##8 3 0 
##9 3 1 
関連する問題