我有一个具有列标签的数据集(Dataraw),如

条件1_男人,条件1_女人,条件2_男人,条件3_女人(等)

我想用它们的名称替换字符串‘Condition1’、‘Condition2’.

condition1名女性=related名女性;

condition2人=unrelated人;

condition3人=filler人;

当前代码:

data <- dataraw %>%
 rename_all(~ str_replace_all(str_replace(., 'condition1', "related"), 'condition2', "unrelated"))

这适用于最多2个字符串,每次我try 添加第三个字符串时,都会收到意外的符号错误.

 data <- dataraw %>%
rename_all(~ str_replace_all(str_replace((., 'condition1', "related"), 'condition2', "unrelated"), 'condition3', "filler")))

我相信这一定很简单,但无论我try 什么组合,我都会遇到错误. 谁能为我指出我正在犯的这个简单的错误? 谢谢.

推荐答案

6年前,rename_allrename_with取代了,我将使用这一点:

library(dplyr)
dataraw <- data.frame(condition1_men=1, condition1_women=2, condition2_men=3, condition2_women=4, condition3_men=5)
dataraw
#   condition1_men condition1_women condition2_men condition2_women condition3_men
# 1              1                2              3                4              5
dataraw |>
  rename_with(.fn = ~ sub("^condition1_", "related_", sub("^condition2_", "unrelated_", .)))
#   related_men related_women unrelated_men unrelated_women condition3_men
# 1           1             2             3               4              5

如果您有一个(命名的)"from=to"赋值向量,我们也可以这样做,更一般一点:

conds <- c(condition1="related", condition2="unrelated")
dataraw |>
  rename_with(.fn = ~ Reduce(function(st, i) sub(names(conds)[i], conds[i], st), seq_along(conds), init = .x))
#   related_men related_women unrelated_men unrelated_women condition3_men
# 1           1             2             3               4              5

我们需要Reduce个,因为我们需要保留以前条件映射的所有更改.

我经常发现,像这样的数据(在以后的数据处理/分析中)以较长的格式(如利米建议的那样)表现得更好.为此,我们还可以做:

dataraw |>
  tidyr::pivot_longer(cols = everything(), names_pattern = "(.*)_(.*)",
                      names_to = c("cond", ".value")) |>
  mutate(cond2 = conds[match(sub("_.*", "", cond), names(conds))])
# # A tibble: 3 × 4
#   cond         men women cond2    
#   <chr>      <dbl> <dbl> <chr>    
# 1 condition1     1     2 related  
# 2 condition2     3     4 unrelated
# 3 condition3     5    NA NA       

不过,如果您的映射位于不同的框架中,可能会更简单(数据管理、可视化、更新等),我们可以将其合并/连接到原始数据上:

cond_df <- tribble(
  ~ cond, ~ cond2
  , "condition1", "related"
  , "condition2", "unrelated"
)
dataraw |>
  tidyr::pivot_longer(cols = everything(), names_pattern = "(.*)_(.*)",
                      names_to = c("cond", ".value")) |>
  left_join(cond_df, by = "cond")
# # A tibble: 3 × 4
#   cond         men women cond2    
#   <chr>      <dbl> <dbl> <chr>    
# 1 condition1     1     2 related  
# 2 condition2     3     4 unrelated
# 3 condition3     5    NA NA       

R相关问答推荐

如何使用行政边界形状文件中的人口普查数据调整格栅数据集中的人口数据

如何提高以键ID为列的表中键查找的效率?

R -模运算后的加法

带有gplot 2的十字舱口

在值和NA的行顺序中寻找中断模式

R等效于LABpascal(n,1)不同的列符号

MCMC和零事件二元逻辑回归

R Highcharts与两个位置关联的注释

使用gcuminc,如何使用逗号格式化风险表?

使用R闪光显示所有数据点作为默认设置

从外部文件读取多个值作为字符向量

R中边际效应包中Logistic回归的交互作用风险比

方法::slotName如何处理非类、非字符的参数?

用两种 colored颜色 填充方框图

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

R如何将列名转换为更好的年和月格式

使用不同的定性属性定制主成分分析中点的 colored颜色 和形状

在gggraph中显示来自不同数据帧的单个值

如何在反曲线图中更改X标签

我是否可以使用多个变异项来构建顺序列(标记多个问题)