2015-03-02 132 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 
相关问题