Ошибка с переименованием функций в список на r - PullRequest
0 голосов
/ 11 января 2019

Мои данные:

library(tidyverse)

1:6%>%
  str_c('var',.)%>%
  map(~assign(.,runif(30,20,100),envir=globalenv()))
tibble<-as_tibble(
  bind_cols(mget(ls(pattern='*v')))
)
cluster<-kmeans(tibble,centers=3)
cluster
tibble$kmeans<-as.factor(cluster[['cluster']])
head(tibble)

Когда примените эту функцию, результат будет нормальным:

names(tibble)[str_which(names(tibble),regex('KMEaNS',ignore_case=TRUE))]<-'variable'

variable - это новое имя.

Для list эта функция не работает:

mylist<-list(dataset1=c(a=1,kmeans=2,c=3),
         dataset2=c(a=4,kmeans=5,c=6),
         dataset2=c(r=7,kmeans=8,p=9))

Первая функция:

mylist%>%
  lapply(function(x){
    lapply(x,names(x)[str_which(names(x),regex('KMEa',ignore_case=T))])<- 'variable'
})

Ошибка в lapply (x, names (x) [str_which (names (x), regex ("KMEa", ignore_case = T))]) <- "переменная": не удалось найти функцию "lapply <-" </p>

Вторая функция:

mylist%>%
  map(.,~names(.)[str_which(names(.),regex('KM',ignore_case=T))])<-'variable'

Ошибка в mylist%>% map (., ~ Names (.) [Str_which (names (.), Regex ("KM", ignore_case = T))]) <- "variable": не удалось найти функцию " %>% <- "</p>

Два вопроса :

  • В чем проблема с этими функциями?

  • Есть решение с dplyr::rename?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

в функции вы должны вернуть x после переименования, чтобы получить желаемый результат -

mylist<-list(dataset1=c(a=1,kmeans=2,c=3),
             dataset2=c(a=4,kmeans=5,c=6),
             dataset2=c(r=7,kmeans=8,p=9))

fn <- function(x) {names(x)[str_which(names(x),regex('KMEa',ignore_case=T))] <- 'variable'
                  return(x)}
lapply(mylist,fn) 

или

mylist %>% lapply( function(x) {names(x)[str_which(names(x),regex('KMEa',ignore_case=T))] <- 'variable'
return(x)})
0 голосов
/ 11 января 2019

Элементы в mylist являются числовым вектором, тогда как для rename_at нам нужны объекты тиббла. Итак, сначала нам нужно преобразовать этот числовой вектор в объект tibble, а затем мы можем использовать map и rename_at вместе.

library(tidyverse)

mylist[] <- lapply(mylist, function(x) as.tibble(t(x)))
map(mylist, ~ rename_at(., vars(contains('kmeans')), ~ 'variable'))


#$dataset1
# A tibble: 1 x 3
#      a variable     c
#  <dbl>    <dbl> <dbl>
#1     1        2     3

#$dataset2
# A tibble: 1 x 3
#      a variable     c
#  <dbl>    <dbl> <dbl>
#1     4        5     6

#$dataset2
# A tibble: 1 x 3
#      r variable     p
#  <dbl>    <dbl> <dbl>
#1     7        8     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...