首页 > 解决方案 > 在 R 中执行此操作的更好方法

问题描述

我从一个数据集中得到了下表。我必须处理数据集,这是我迄今为止一直在使用的代码:

X_1 X_2
<chr> <chr>
16% (4/25) 32% (8/25)
16% (4/25) 32% (8/25)
16% (4/25) 32% (8/25)
16% (4/25) 32% (8/25)
16% (4/25) 32% (8/25)
library(tidyverse)
names(age) <- c("Age18.25","Age26.35","Age36.45","Age46.55","Age56.65","Agegt65")
age <- age %>%
  dplyr::select(names(age)) %>% 
  dplyr::mutate( Age18.25 = sub('\\%.*', '', Age18.25),
    Age26.35 = sub('\\%.*', '', Age26.35),
    Age36.45 = sub('\\%.*', '', Age36.45),
    Age46.55 = sub('\\%.*', '', Age46.55),
    Age56.65 = sub('\\%.*', '', Age56.65),
    Agegt65 = sub('\\%.*', '', Agegt65))
age[] <- lapply(age, function(x) as.numeric(x))
head(age)

有没有更好的方法可以为我必须做的其他数据帧做同样的事情?所有数据框都具有相同的组成,我只想提取百分比,但是,当我这样做让我重命名它们时,列会有所不同并且列名一直存在问题。

这是输出。

X_1 X_2
<dbl> <dbl>
16 32
16 32

这是 dput 头部年龄:

structure(list(Age18.25 = c(11, 9, 40, 41, 19, 17), Age26.35 = c(18, 
20, 23, 26, 30, 23), Age36.45 = c(18, 28, 17, 19, 12, 22), Age46.55 = c(14, 
15, 7, 15, 14, 23), Age56.65 = c(14, 8, 13, 0, 14, 13), Agegt65 = c(25, 
20, 0, 0, 12, 1)), row.names = c(NA, 6L), class = "data.frame")

标签: rdataframedplyr

解决方案


单线base R解决方案:

sapply(df, function(x) as.numeric(sub("%.*", "", x)))
        X1      X2
[1,] 45.00 566.000
[2,] 12.33   0.009
[3,]  1.00  33.000

数据:

df <- data.frame(
  X1 = c("45% (4/25)", "12.33%", "1"),
  X2 = c("566", "0.009% (8/66)", "33%")
)

推荐阅读