【问题标题】:Replacement of column values based on a named vector基于命名向量替换列值
【发布时间】:2020-12-07 09:10:10
【问题描述】:

考虑以下命名向量vec 和tibble df

vec <- c("1" = "a", "2" = "b", "3" = "c")
df <- tibble(col = rep(1:3, c(4, 2, 5)))

df
# # A tibble: 11 x 1
#      col
#    <int>
#  1     1
#  2     1
#  3     1
#  4     1
#  5     2
#  6     2
#  7     3
#  8     3
#  9     3
# 10     3
# 11     3

我想将col 列中的值替换为vec 中对应的命名值。

我正在寻找一种tidyverse 方法,它不涉及将vec 转换为小标题。

我尝试了以下方法,但没有成功:

df %>% 
  mutate(col = map(
    vec,
    ~ str_replace(col, names(.x), .x)
  ))

预期输出:

# A tibble: 11 x 1
   col    
   <chr>
 1 a    
 2 a    
 3 a    
 4 a    
 5 b    
 6 b    
 7 c    
 8 c    
 9 c    
10 c    
11 c  

【问题讨论】:

  • df %&gt;% mutate(col = str_replace_all(col, vec)) 应该可以完成这项工作。

标签: r tidyverse


【解决方案1】:

你可以使用col

df$col1 <- vec[as.character(df$col)]

mutate

library(dplyr)
df %>% mutate(col1 = vec[as.character(col)])
#   col col1 
#   <int> <chr>
# 1     1 a    
# 2     1 a    
# 3     1 a    
# 4     1 a    
# 5     2 b    
# 6     2 b    
# 7     3 c    
# 8     3 c    
# 9     3 c    
#10     3 c    
#11     3 c    

【讨论】:

  • 我正在寻找一种可以在管道链中使用的与 tidyverse 兼容的方法。
  • 添加了一个在管道中使用它的选项。 @Junitar
【解决方案2】:

我们也可以使用data.table

library(data.table)
setDT(df)[, col1 := vec[as.character(col)]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2021-10-04
    • 2011-04-23
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多