2017-03-16 26 views
0

私のデータは、このようになります新しい列に列から値をコピー:各「アイテム」のための「ID」列の下の値に応じて、Rは - 条件付き

Item | S1 | S2 | S3 | S4 | ID | New 
A | 1 | 2 | 5 | 8 | 1 | 
A | 4 | 4 | 5 | 4 | 1 | 
A | 6 | 7 | 1 | 3 | 1 | 
A | 4 | 1 | 7 | 6 | 1 | 
B | 3 | 1 | 5 | 3 | 2 | 
B | 1 | 4 | 5 | 2 | 2 | 
B | 8 | 7 | 3 | 6 | 2 | 
B | 4 | 1 | 5 | 2 | 2 | 
C | 4 | 2 | 6 | 4 | 4 | 
C | 6 | 6 | 7 | 1 | 4 | 
C | 2 | 3 | 3 | 7 | 4 | 
C | 5 | 8 | 9 | 2 | 4 | 
D | 2 | 1 | 2 | 3 | 3 | 
D | 2 | 6 | 7 | 6 | 3 | 
D | 2 | 3 | 0 | 4 | 3 | 
D | 2 | 1 | 2 | 1 | 3 | 
E | 6 | 1 | 3 | 5 | 4 | 
E | 3 | 2 | 4 | 4 | 4 | 
E | 6 | 6 | 7 | 7 | 4 | 
E | 3 | 8 | 1 | 4 | 4 | 

、私は「列を移入したいですS1、S2、S3またはS4からの値で「新規」を選択します。たとえば、AのIDは1なので、S1の​​下の値だけを新しい列に入れたいとします。

出力に必要:今

Item | S1 | S2 | S3 | S4 | ID | New 
A | 1 | 2 | 5 | 8 | 1 | 1 
A | 4 | 4 | 5 | 4 | 1 | 4 
A | 6 | 7 | 1 | 3 | 1 | 6 
A | 4 | 1 | 7 | 6 | 1 | 4 
B | 3 | 1 | 5 | 3 | 2 | 1 
B | 1 | 4 | 5 | 2 | 2 | 4 
B | 8 | 7 | 3 | 6 | 2 | 7 
B | 4 | 1 | 5 | 2 | 2 | 1 
C | 4 | 2 | 6 | 4 | 4 | 4 
C | 6 | 6 | 7 | 1 | 4 | 1 
C | 2 | 3 | 3 | 7 | 4 | 7 
C | 5 | 8 | 9 | 2 | 4 | 2 
D | 2 | 1 | 2 | 3 | 3 | 2 
D | 2 | 6 | 7 | 6 | 3 | 7 
D | 2 | 3 | 0 | 4 | 3 | 0 
D | 2 | 1 | 2 | 1 | 3 | 2 
E | 6 | 1 | 3 | 5 | 4 | 5 
E | 3 | 2 | 4 | 4 | 4 | 4 
E | 6 | 6 | 7 | 7 | 4 | 7 
E | 3 | 8 | 1 | 4 | 4 | 4 

、私は、各項目のIDを比較し、ループ内でpaste0("S", counter_variable)を使用して列を選択するには、ループのために使用しています。私のデータは、「アイテム」の下に約4万の異なる値を持ち、1,200万行を超えています。これを行うより速い方法がありますか?

+0

、それは 'DFだろう[2:5] [CBIND(seq_along(DFます$ ID)、DF $ ID)]' –

答えて

-1

おそらく、変換テーブルを使用できます。

data <- read.table("/home/wang/Downloads/test.txt", header = T, sep = "|") 
tran_table <- paste0("S", 1:4) 
names(tran_table) <- 1:4 
data$ID <- tran_table[data$ID] 

match_value <- function(ID_value){ 
    index <- which(data$ID == ID_value) 
    data$New[index] <<- eval(parse(text = paste0("data$", ID_value)))[index] 
    return(NULL) 
} 
apply(matrix(tran_table, ncol=1), 1, match_value) 

そして結果は次のとおりです。

あなたのケースのために
> data 
    Item S1 S2 S3 S4 ID New 
1  A 1 2 5 8 S1 1 
2  A 4 4 5 4 S1 4 
3  A 6 7 1 3 S1 6 
4  A 4 1 7 6 S1 4 
5  B 3 1 5 3 S2 1 
6  B 1 4 5 2 S2 4 
7  B 8 7 3 6 S2 7 
8  B 4 1 5 2 S2 1 
9  C 4 2 6 4 S4 4 
10 C 6 6 7 1 S4 1 
11 C 2 3 3 7 S4 7 
12 C 5 8 9 2 S4 2 
13 D 2 1 2 3 S3 2 
14 D 2 6 7 6 S3 7 
15 D 2 3 0 4 S3 0 
16 D 2 1 2 1 S3 2 
17 E 6 1 3 5 S4 5 
18 E 3 2 4 4 S4 4 
19 E 6 6 7 7 S4 7 
20 E 3 8 1 4 S4 4