2017-04-05 20 views
1

替換在一個數據幀索引值由組ID我有一個數據幀:如何在r中

df = read.table(text="index group S1 S2 S3 S4 
    1 A 2 3 4 6 
    2 A 3 4 1 6 
    3 A 2 4 1 5 
    4 B 5 6 2 3 
    5 B 6 4 9 10 
    6 B 5 4 8 11 
    7 B 11 12 8 10 
    8 C 11 9 10 12 
    9 C 10 8 11 12 
    10 C 9 8 11 12 
    11 D 8 9 10 12 
    12 D 9 10 8 11", header=T, stringsAsFactors=F) 

我想與列「基團」的值替換列S1-S4的值,如果列S1-S4中的值與列「索引」匹配。 所以預期的結果是:

index S1 S2 S3 S4 
    1 A A B B 
    2 A B A B 
    3 A B A B 
    4 B B A A 
    5 B B C C 
    6 B B C D 
    7 D D C C 
    8 D C C D 
    9 C C D D 
    10 C C D D 
    11 C C C D 
    12 C C C D 

我可以得到一個循環,並匹配的結果,但我不滿意的解決方案。我明白任何幫助

+1

喜歡這張'DF爲此[,3:6] < - DF $組[不公開(DF [,3:6])]' ?這與列S1-S4中(未列出)索引對組列的子集一樣簡單。 –

回答

2

該值在列S1 ... S4是df$group指數:

df[, -(1:2)] <- lapply(df[-(1:2)], function(x) df$group[x]) 
# > df 
# index group S1 S2 S3 S4 
# 1  1  A A A B B 
# 2  2  A A B A B 
# 3  3  A A B A B 
# 4  4  B B B A A 
# 5  5  B B B C C 
# 6  6  B B B C D 
# 7  7  B D D C C 
# 8  8  C D C C D 
# 9  9  C C C D D 
# 10 10  C C C D D 
# 11 11  D C C C D 
# 12 12  D C C C D 

或者(如果你只想要最後四列):

as.data.frame(lapply(df[-(1:2)], function(x) df$group[x])) 
#> as.data.frame(lapply(df[-(1:2)], function(x) df$group[x])) 
# S1 S2 S3 S4 
# 1 A A B B 
# 2 A B A B 
# 3 A B A B 
# 4 B B A A 
# 5 B B C C 
# 6 B B C D 
# 7 D D C C 
# 8 D C C D 
# 9 C C D D 
# 10 C C D D 
# 11 C C C D 
# 12 C C C D 
+0

Ronak和docendo的解決方案速度更快,因爲它們不通過列循環。 Ronak的解決方案甚至與'df $ index'比較(對於'df $ index'與行號不相同的情況) – jogo

2

我們可以將match的所有4列的值與index的值進行比較,並提取相應的group值。

df[3:6] <- df$group[match(unlist(df[3:6]), df$index)] 

df 
# index group S1 S2 S3 S4 
#1  1  A A A B B 
#2  2  A A B A B 
#3  3  A A B A B 
#4  4  B B B A A 
#5  5  B B B C C 
#6  6  B B B C D 
#7  7  B D D C C 
#8  8  C D C C D 
#9  9  C C C D D 
#10 10  C C C D D 
#11 11  D C C C D 
#12 12  D C C C D 
0

我們也可以通過轉換爲matrix

df[-(1:2)] <- setNames(df$group, df$index)[as.matrix(df[-(1:2)])] 
df 
# index group S1 S2 S3 S4 
#1  1  A A A B B 
#2  2  A A B A B 
#3  3  A A B A B 
#4  4  B B B A A 
#5  5  B B B C C 
#6  6  B B B C D 
#7  7  B D D C C 
#8  8  C D C C D 
#9  9  C C C D D 
#10 10  C C C D D 
#11 11  D C C C D 
#12 12  D C C C D