Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于另一列(对于某些行)更改列的值_R - Fatal编程技术网

R 基于另一列(对于某些行)更改列的值

R 基于另一列(对于某些行)更改列的值,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

我有一个数据帧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
我试过了

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$category
df$category
indx如果要使用
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