2016-09-30 70 views
4

我需要用相應的字符串替換列中的值。在我的搜索中,我遇到了類似的問題,其答案與我正在尋找的內容非常匹配,但沒有任何內容完全符合我的需求。因爲我是初學者,所以如果你能解釋這段代碼是如何工作的話,它會有所幫助。R中的數據操作:系統地用字符串替換列中的值

我想從一個數據集是這樣的

A B C D 

1 1 64 20 1 
2 2 64 20 3 
3 3 64 20 3 
4 4 64 20 1 
5 5 64 20 2 

到數據集,看起來像這樣使用密鑰1 =蘋果,2 =水箭龜,3 =旋轉木馬

A B C D 

1 1 64 20 Apple 
2 2 64 20 Carousel 
3 3 64 20 Carousel 
4 4 64 20 Apple 
5 5 64 20 Blastoise 

我明白你可以使用像

df$D <- "label" 

更改列的值。

但是,我不知道如何讓「標籤」部分與相應的值匹配。

預先感謝您!

+0

'DF $ d =係數(DF $ d,水平= 1:3,標籤= C( 「蘋果」, 「水箭龜」, 「旋轉木馬」))將是一個好方法。 – Gregor

回答

2

這裏的一個baseR選項是使用merge。首先,創建該D列值映射到標籤的一個數據幀:

labels <- data.frame(D=c(1,2,3), label=c("Apple", "Blastoise", "Carousel")) 

然後做合併:如果要保留原始列順序

result <- merge(df, labels, by="D") 

result 
    D A B C  label 
1 1 1 64 20  Apple 
2 1 4 64 20  Apple 
3 2 5 64 20 Blastoise 
4 3 2 64 20 Carousel 
5 3 3 64 20 Carousel 

,用途:

result <- merge(df, labels, by="D")[, union(names(df), names(labels))] 
+0

這工作得很好!謝謝!唯一的缺點是它並不能真正保留相對較小的列順序。 – kevinchangwang

1

有幾種方法可以做到這一點:

使用列D作爲索引:

df$D是一個包含整數1,2和3的向量。您必須將它們視爲索引的集合。例如:

df$D = c(1,3,3,1,2) 

另一種載體包含的名字:

v_names = c("Apple","Blastoise","Carousel") 

如果你使用df$Dv_names指標會發生什麼?

v_names[df$D] 
[1] "Apple"  "Carousel" "Carousel" "Apple"  "Blastoise" 

你會得到具有相同長度與替換這些指標值的名稱索引(df$D)收集的載體。

使用ifelse:

這種方式需要存在許多ifelse姓名,所以不建議它。

ifelse(df$D==1,"Apple",ifelse(df$D==2,"Blastoise","Carousel")) 
[1] "Apple"  "Carousel" "Carousel" "Apple"  "Blastoise" 

正如你所看到的,它們是嵌套的ifelse。如果有三種以上的不同情況,很難閱讀。

使用因素

如果您將您的列因素,那麼與名稱更改級別:

df$D = as.factor(df$D) 
levels(df$D) = c("Apple","Blastoise","Carousel") 

> df$D 
[1] Apple  Carousel Carousel Apple  Blastoise 
Levels: Apple Blastoise Carousel 

的這裏不便的是,該列是一個因素。如果你想要做的琴絃的東西,你必須轉換爲字符第一

df$D = as.character(df$D)