首页 > 解决方案 > 如何在多列上使用 map() 函数

问题描述

我有一个看起来像这样的数据框:

x1   x2   x3     x4   ...
56   45   34    76    ...
56+3 56   42    43    ...
38   53   56-1  55+3  ...
...   ...   ...  ...   ...

在超过 30 列的每一行中,我只想保留前 2 个字符,所以基本上我想删除所有这些“+3”、“-1”等。所以最后我将拥有:

x1   x2   x3     x4   ...
56   45   34    76    ...
56   56   42    43    ...
38   53   56    55    ...
...   ...   ...  ...   ...

我使用下面的代码在单个列中进行此类更改,但我希望能够一次在多个列上实现它。最后,如您所见,我需要将每一列都设为一个因素。

A <- substr(data$x1, start = 1, stop = 2)
data$x1 <- as.factor(A) 

我考虑过使用 purrr 中的 map 功能,但我不知道该怎么做。

标签: r

解决方案


使用正则表达式解决方案 and apply,我们可以从每个单元格返回一组任何内容,后跟一个+or -,后跟任意数量的数字。

apply(df,c(1,2),function(x) gsub('(.*)[+-]\\d+','\\1',x))

      x1   x2   x3   x4  
[1,] "56" "45" "34" "76"
[2,] "56" "56" "42" "43"
[3,] "38" "53" "56" "55"

使用map

library(dplyr)
library(purrr)
#map_df(df,~gsub('(.*)[+-]\\d+','\\1',.x))
df %>% map_df(.,~gsub('(.*)[+-]\\d+','\\1',.x)) %>%
       mutate_at(vars(starts_with("x")),as.factor)  #Change any var start with x to factor

# A tibble: 3 x 4
  x1    x2    x3    x4   
 <fct> <fct> <fct> <fct>
1 56    45    34    76   
2 56    56    42    43   
3 38    53    56    55 

数据

df <- read.table(text = "
             x1   x2   x3     x4  
             56   45   34    76    
             56+3 56   42    43    
             38   53   56-1  55+3
",header=T)

推荐阅读