我的数据:
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))])错误)<-“ variable”:找不到函数“ 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))])<-“变量”:找不到函数“ %>%<-“
两个问题:
这些功能有什么问题?
dplyr::rename
有解决方案吗?
答案 0 :(得分:1)
mylist
中的元素是数字矢量,而要使rename_at
工作,我们需要一个小对象。因此,首先我们需要将该数字矢量转换为小对象,然后可以同时使用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
答案 1 :(得分:1)
在函数中,您应该在重命名后返回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)})