根据另一列中的元素重命名特定列元素
Posted
技术标签:
【中文标题】根据另一列中的元素重命名特定列元素【英文标题】:Rename specific column elements based on elements in another column 【发布时间】:2022-01-17 16:59:14 【问题描述】:抱歉,如果这是一个简单的问题,我真的很难找到解决方案。这里有一个类似的问题,但并不完全相同,而且似乎没有一个解决方案对我有用:Replacing row elements in a column based on row elements from another column in Tidyverse
我有一个df如下:
Loop <- c('0','1','','0','1','2','0','1','','0','1','2')
Condition <- c('base','base','base','AOMI1','AOMI1','AOMI1','control','control',
'control','AOMI2','AOMI2','AOMI2')
df <- data.frame(Loop, Condition)
Loop Condition
1 0 base
2 1 base
3 base
4 0 AOMI1
5 1 AOMI1
6 2 AOMI1
7 0 control
8 1 control
9 control
10 0 AOMI2
11 1 AOMI2
12 2 AOMI2
我想重命名名为“循环”的列中的所有“1”实例,但对于“条件”列中的不同条件不同。对于“基本”和“控制”条件,我希望将“1”重命名为“imageryQ”,对于“AOMI1”和“AOMI2”,我希望“1”变为“VI”。这就是我希望数据的样子:
Loop2 Condition
1 0 base
2 imageryQ base
3 base
4 0 AOMI1
5 VI AOMI1
6 2 AOMI1
7 0 control
8 imageryQ control
9 control
10 0 AOMI2
11 VI AOMI2
12 2 AOMI2
如果这可以基于列内容而不是行号来完成会更好,因为我不确定数据是否会改变。但它不太可能改变,所以如果使用行号的解决方案更简单,那么这些选项也会很好!
非常感谢任何帮助。
【问题讨论】:
您可以使用case_when
,就像在您发布的链接中一样。 mutate(df, Loop2 = case_when(Loop != 1 ~ Loop, Condition %in% c("base", "control") ~ "imageryQ", str_detect(Condition, "AOMI") ~ "VI"))
@caldwellst 谢谢,但这不起作用。运行代码会更改 Loop 列中 1、2 或 NA 的每个实例,而不仅仅是 1 用于基础、AOMI1 和 AOMI2 条件,并且 NA 会替换 Loop 列中的 1 和 2 用于控制条件。
【参考方案1】:
这可以使用一个简单的 dplyr::case_when 函数来完成:
library(tidyverse)
Loop <- c('0','1','','0','1','2','0','1','','0','1','2')
Condition <- c('base','base','base','AOMI1','AOMI1','AOMI1','control','control',
'control','AOMI2','AOMI2','AOMI2')
df <- data.frame(Loop, Condition)
df %>%
mutate(Loop = case_when(
Loop == "1" & Condition == "base" ~ "imageryQ",
Loop == "1" & Condition == "control" ~ "imageryQ",
Loop == "1" & Condition == "AOMI1" ~ "VI",
Loop == "1" & Condition == "AOMI2" ~ "VI",
TRUE ~ Loop
))
你可以通过写作来缩短它
Loop == "1" & Condition %in% c("base","contorl") ~ "imageryQ"
【讨论】:
太棒了,非常感谢!以上是关于根据另一列中的元素重命名特定列元素的主要内容,如果未能解决你的问题,请参考以下文章