根据长度重新编码变量

标签 r tidyverse

我有一个大型数据框,其结构如下:

id v1 v2 v3 v4 v5
1  1  1 98  1  1
2  1  1  1  1  1
3  4  1  0 22  1
4  5  1  1  1  1
5  1  1 90  1  1 

我想从v2一直移动到v5,如果变量值的长度大于1个字符,那么它会被重新编码为9,所以结果df将是:

id v1 v2 v3 v4 v5
1  1  1  9  1  1
2  1  1  1  1  1
3  4  1  0  9  1
4  5  1  1  1  1
5  1  1  9  1  1 
  • 注意:所有变量都存储为字符串,这就是为什么我希望将长度作为答案的一部分。

最佳答案

如果这是一个大型dataframe,使用data.table库,您可以这样做:

Reprex

  • 代码
library(data.table)

cols <- paste0("v", 2:5)
setDT(df)[, (cols) := lapply(.SD, function(x) fifelse(nchar(x) > 1, 9, x)), .SDcols = cols][]
  • 输出
#>    id v1 v2 v3 v4 v5
#> 1:  1  1  1  9  1  1
#> 2:  2  1  1  1  1  1
#> 3:  3  4  1  0  9  1
#> 4:  4  5  1  1  1  1
#> 5:  5  1  1  9  1  1

reprex package 于 2022 年 3 月 14 日创建(v2.0.1)


编辑:

dplyr 解决方案

  • 代码
library(dplyr)

df %>% mutate(across(v2:v5, ~ ifelse(nchar(.x) > 1, 9, .x)))
  • 输出
#>   id v1 v2 v3 v4 v5
#> 1  1  1  1  9  1  1
#> 2  2  1  1  1  1  1
#> 3  3  4  1  0  9  1
#> 4  4  5  1  1  1  1
#> 5  5  1  1  9  1  1

基础 R 解决方案

  • 代码
cols <- paste0("v", 2:5)
df[, cols] <- apply(df[, cols], c(1,2), function(x) ifelse(nchar(x) > 1, 9, x))
  • 输出
df
#>   id v1 v2 v3 v4 v5
#> 1  1  1  1  9  1  1
#> 2  2  1  1  1  1  1
#> 3  3  4  1  0  9  1
#> 4  4  5  1  1  1  1
#> 5  5  1  1  9  1  1

reprex package 于 2022 年 3 月 14 日创建(v2.0.1)

关于根据长度重新编码变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71461537/

相关文章:

根据多列的最大值减少分组数据

r - 从谷歌街道地址中提取城市和州信息

r - 使用管道语法处理模型列表

r - 使用 dplyr 中的条件合并两列

r - 如何将大量模型传递给gather_predictions

r - 在 dplyr 中跨列过滤

r - 如何使用具有列名和行名的值创建矩阵?

r - 满足条件时如何重复序列

r - 如何从 dplyr 管道中解压 group_by() do() 输出

r - 如何将函数应用于数据框中的所有行组合?