根据另一列中的元素重命名特定列元素

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"

【讨论】:

太棒了,非常感谢!

以上是关于根据另一列中的元素重命名特定列元素的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名与另一列同名的列

如何根据所述数组的长度重命名数组中的元素? (在 Unity 检查器中)

重命名值输出并将值合并到 SQL 中的一列中

Python-根据另一个变量重命名重复值

如何重命名SQL Server中计算列中引用的列?

如何根据另一列中的特定日期和级别为列分配级别?