我如何删除一个百分号,并使用r查找列中某些值的平均值?

我如何删除一个百分号,并使用r查找列中某些值的平均值?,r,dplyr,R,Dplyr,我在数据集中有一列名为债务与收入之比。列中的前六个值如下所示: 1. 45 2. 43 3. 20%-<30% 4. 38 5. 49 6. 50%-60% 我也不知道如何在一列中只找到某些值的平均值。提前感谢您的帮助 这里有一种可能性,即使用purrr包中的map和str\u extract\u all包中的 library(tidyverse) mydata %>% mutate(debt_to_income_ratio = map_dbl(debt_to_income_

我在数据集中有一列名为
债务与收入之比
。列中的前六个值如下所示:

1. 45
2. 43
3. 20%-<30%
4. 38
5. 49
6. 50%-60%

我也不知道如何在一列中只找到某些值的平均值。提前感谢您的帮助

这里有一种可能性,即使用
purrr
包中的
map
str\u extract\u all
包中的

library(tidyverse)

mydata %>%
  mutate(debt_to_income_ratio = map_dbl(debt_to_income_ratio,
                                        ~mean(as.numeric(str_extract_all(.x, "\\d+")[[1]]))))
以下是我使用的数据:

mydata <- tibble(debt_to_income_ratio = c("45", "43", "20%<30%", "38", "49", "50%<60%"))

mydatatidyverse选项与您的数据

债务与收入的比率%
地图(
~z~如果还有其他人(
长度(.x)==1,
作为.numeric(.x),
平均值(未列出(作为.numeric(.x)))
)
)
)
债务与收入之比
#>新霉素
#> 1       45       45
#> 2       43       43
#> 3 20%- 4       38       38
#> 5       49       49
#> 6  50%-60%       55

这里有一个
基本R
解决方案

debt_to_income_ratio$mean <- unlist(lapply(lapply(strsplit(sub("(\\d+)%-<?(\\d+)%", "\\1 \\2", debt_to_income_ratio$mycol), " "), as.numeric), mean))

debt\u to\u income\u ratio$mean这里有一个
base R
解决方案:

extracted <- regmatches(df$debt_to_income_ratio, gregexpr("\\d+", df$debt_to_income_ratio))
df$debt_to_income_ratio <- sapply(extracted, function(x) mean(as.numeric(x)))

  debt_to_income_ratio
1                   45
2                   43
3                   25
4                   38
5                   49
6                   55

extracted我们也可以将
rowMeans
extract

library(dplyr)
library(tidyr)
debt_to_income_ratio %>% 
  extract(mycol, into = c('col1', 'col2'), "^(\\d+)\\D*(\\d*).*", convert = TRUE) %>% 
   transmute(mycol = rowMeans(., na.rm = TRUE))
#  mycol
#1    45
#2    43
#3    25
#4    38
#5    49
#6    55
数据
debt\u-to\u-income\u ratio您可以通过将
unlist(lappy
替换为
sapply
来稍微简化这个问题。就像我的回答一样,我更喜欢在
sapply
中使用自定义函数,而不是将多个
lappy
sapply(strsplit(sub(\\d+)%-
debt_to_income_ratio
     mycol mean
1       45   45
2       43   43
3 20%-<30%   25
4       38   38
5       49   49
6  50%-60%   55
extracted <- regmatches(df$debt_to_income_ratio, gregexpr("\\d+", df$debt_to_income_ratio))
df$debt_to_income_ratio <- sapply(extracted, function(x) mean(as.numeric(x)))

  debt_to_income_ratio
1                   45
2                   43
3                   25
4                   38
5                   49
6                   55
df <- data.frame(debt_to_income_ratio = c(45,43,"20%-<30%",38,49,"50%-60%"))
library(dplyr)
library(tidyr)
debt_to_income_ratio %>% 
  extract(mycol, into = c('col1', 'col2'), "^(\\d+)\\D*(\\d*).*", convert = TRUE) %>% 
   transmute(mycol = rowMeans(., na.rm = TRUE))
#  mycol
#1    45
#2    43
#3    25
#4    38
#5    49
#6    55
debt_to_income_ratio <- structure(list(mycol = c("45", "43", "20%-<30%", "38", "49", 
"50%-60%")), class = "data.frame", row.names = c(NA, -6L))