r - 如何在多列上使用 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 功能,但我不知道该怎么做。
解决方案
使用正则表达式解决方案 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)
推荐阅读
- amp-html - 使用 Next.js 实现 AMP
- vb.net - 在外部窗口中获取控件的位置
- android - 如何将项目与 Gradle 文件同步?
- reactjs - 我只是尝试检查在渲染调用后发生了什么 componentdidmount 更改状态和值,但得到了意外的结果
- mysql - MySql 查询:另一列的可选连接
- php - 万事达卡MIGS api
- excel - Excel VBA - 模块范围的变量
- javascript - 仅在 Fancybox 中替换附加 div 的内容一次
- php - Laravel:使用带有斜线的哈希令牌进行自定义验证
- c++ - 在代码块中运行图形程序时出错