我如何删除一个百分号,并使用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))