R 基于另一列(对于某些行)更改列的值
我有一个数据帧dfR 基于另一列(对于某些行)更改列的值,r,R,我有一个数据帧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 Shi
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
我试过了
library(dplyr)
res <- df %>%
filter(category=="Shirts") %>%
mutate(category=subcategory)
库(dplyr)
res%
过滤器(类别==“衬衫”)%>%
变异(类别=子类别)
结果与我想要的很接近,但它不包含第4行和第5行
有人能帮我解决这个问题吗?不确定您是否在寻找一个只有“dplyr”的答案(您的问题没有这样标记),但“data.table”非常简单: 我想使用“dplyr”,您可以尝试
ifelse
(也可能replace
):
df[-1]%
变异(类别=ifelse(类别=衬衫),
子类别
我知道这可能有很长的路要走(远不及Amanda Mahto的解决方案优雅),但你可以将类别和子类别列转换为字符,进行索引和更新,然后将它们转换回因子
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)
df$categorydf$categoryindx如果要使用dplyr
我建议使用dplyr::If_else()
。它检查true和false是否为同一类型。这种严格性使输出类型更可预测,并且速度更快
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
df[-1] <- lapply(df[-1], as.character) ## Convert factors to characters
df %>%
mutate(category = ifelse(category == "Shirts",
subcategory, category))
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)
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