#r #select #dplyr #suffix
Вопрос:
У меня есть фрейм данных, похожий на этот.
df <- data.frame(id=c(1,2,3), tot_1=runif(3, 0, 100), tot_2=runif(3, 0, 100), tot_3=runif(3, 0, 100), tot_4=runif(3, 0, 100))
Я хочу выбрать или выполнить операцию только с теми, у кого суффиксы меньше 3.
#select
df <- df %>% select(id, tot_1, tot_2)
#or sum
df <- df %>% mutate(sumVar = rowSums(across(c(tot_1, tot_2))))
Однако в моих реальных данных есть еще много переменных, и не в порядке. Так как же я мог выбрать их, не делая этого вручную?
Ответ №1:
Мы можем использовать matches
df %>%
mutate(sumVar = rowSums(across(matches('tot_[1-2]
Если нам нужно быть более гибкими, извлеките часть цифр из имен столбцов, которая начинается с "tot", подмножество на основе условия и используйте эти новые имена
library(stringr)
nm1 <- str_subset(names(df), 'tot')
nm2 <- nm1[readr::parse_number(nm1) <3]
df %>%
mutate(sumVar = rowSums(across(all_of(nm2))))
Комментарии:
1. Я свои реальные данные У меня диапазон больше 10, поэтому мне понадобится что-то вроде совпадений('tot_[1-112]$'), но это не работает с этим диапазоном
Ответ №2:
Решение с num_range
Это редкий случай для часто забываемого num_range
помощника по выбору от dplyr, который извлекает числа из имен за один шаг, а затем выбирает диапазон:
определите пороговое значение
suffix_threshold <- 3
Выберите( )
library(dplyr)
df %>% select(id, num_range(prefix='tot_',
range=seq_len(suffix_threshold-1)))
id tot_1 tot_2
1 1 26.75082 26.89506
2 2 21.86453 18.11683
3 3 51.67968 51.85761
мутировать() с суммами строк()
library(dplyr)
df %>% mutate(sumVar = across(num_range(prefix='tot_', range=seq_len(suffix_threshold-1)))%>%
rowSums)
id tot_1 tot_2 tot_3 tot_4 sumVar
1 1 26.75082 26.89506 56.27829 71.79353 53.64588
2 2 21.86453 18.11683 12.91569 96.14099 39.98136
3 3 51.67968 51.85761 25.63676 10.01408 103.53730
Комментарии:
1. @user2246905 , это работает с вашим набором данных?
Ответ №3:
Вот базовый способ R -
cols <- grep('tot_', names(df), value = TRUE)
#Select
df[c('id', cols[as.numeric(sub('tot_', '',cols)) < 3])]
# id tot_1 tot_2
#1 1 75.409112 30.59338
#2 2 9.613496 44.96151
#3 3 58.589574 64.90672
#Rowsums
df$sumVar <- rowSums(df[cols[as.numeric(sub('tot_', '',cols)) < 3]])
df
# id tot_1 tot_2 tot_3 tot_4 sumVar
#1 1 75.409112 30.59338 59.82815 50.495758 106.00250
#2 2 9.613496 44.96151 84.19916 2.189482 54.57501
#3 3 58.589574 64.90672 18.17310 71.390459 123.49629
))))
Если нам нужно быть более гибкими, извлеките часть цифр из имен столбцов, которая начинается с «tot», подмножество на основе условия и используйте эти новые имена
Комментарии:
1. Я свои реальные данные У меня диапазон больше 10, поэтому мне понадобится что-то вроде совпадений(‘tot_[1-112]$’), но это не работает с этим диапазоном
Ответ №2:
Решение с num_range
Это редкий случай для часто забываемого num_range
помощника по выбору от dplyr, который извлекает числа из имен за один шаг, а затем выбирает диапазон:
определите пороговое значение
Выберите( )
мутировать() с суммами строк()
Комментарии:
1. @user2246905 , это работает с вашим набором данных?
Ответ №3:
Вот базовый способ R —