2015-03-02 100 views
2

我有一個數據幀DF更改列的值的基礎上,另一列(某些行)

ID <- c(1,2,3,4,5) 
category <- c("Shirts", "Shirts", "Shirts", "Sweaters", "Sweaters") 
subcategory <- c("V-Neck","V-Neck","Round","Striped","Striped") 
df <- data.frame(ID,category,subcategory) 

ID category subcategory 
1 Shirts  V-Neck 
2 Shirts  V-Neck 
3 Shirts  Round 
4 Sweaters Striped 
5 Sweaters Striped 

我想列「子類別」的名義分配給列「類別」所有行,其中類別== 「襯衫」

我的結果應該是這樣的:

ID category subcategory 
1 V-Neck  V-Neck 
2 V-Neck  V-Neck 
3 Round  Round 
4 Sweaters Striped 
5 Sweaters Striped 

我試圖

library(dplyr) 
res <- df %>% 
    filter(category=="Shirts") %>% 
    mutate(category=subcategory) 

和結果是接近我在找什麼,但它不包含行4和5.

有人可以幫我解決這個問題嗎?

+0

'INDX < - 類別== 「襯衫」; df $ category [indx] < - df $ subcategory [indx]'。但是,如果「類別」是一個因素,這將不起作用 – 2015-03-02 14:52:56

回答

4

不知道,如果你正在尋找一個「dplyr」只能回答(你的問題沒有標記爲這樣),但是這是非常簡單的用「data.table」:

library(data.table) 
as.data.table(df)[category == "Shirts", category := subcategory][] 
# ID category subcategory 
# 1: 1  V   V 
# 2: 2  V   V 
# 3: 3 Round  Round 
# 4: 4 Sweaters  Striped 
# 5: 5 Sweaters  Striped 

我想用「 dplyr」,你可以嘗試ifelse(也可能是replace):

df[-1] <- lapply(df[-1], as.character) ## Convert factors to characters 
df %>% 
    mutate(category = ifelse(category == "Shirts", 
          subcategory, category)) 
1

我知道這可能是一個漫長的道路輪(與遠不及優雅的阿曼達Mahto的解決方案),但你可以在你的類別和子類別列轉換爲字符,做你的索引和更新, n將它們轉換回一個因子。

df$category <- as.character(df$category); df$subcategory <- as.character(df$subcategory) 
indx <- category == "Shirts" ; df$category[indx] <- df$subcategory[indx] 
df$category <- as.factor(df$category); df$subcategory <- as.factor(df$subcategory) 
1
df$category <- ifelse(df$category=="Shirts", 
         as.character(df$subcategory), 
         as.character(df$category)) 
df 
# ID category subcategory 
# 1 1  V   V 
# 2 2  V   V 
# 3 3 Round  Round 
# 4 4 Sweaters  Striped 
# 5 5 Sweaters  Striped 
相關問題