2017-03-16 42 views
0

我的數據是這樣的:的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 | 

根據爲每一個「項目」的「ID」列下的價值,我想填充柱「新「,其值爲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 

現在,我使用for循環來比較每個項目的ID,然後在循環中使用paste0("S", counter_variable)列。我的數據在「Item」和超過1,200萬行下有大約40,000個不同的值,而且這是永久的。有沒有更快的方法來做到這一點?

+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