R 利用变量值/类型重命名列

R 利用变量值/类型重命名列,r,dplyr,data-management,R,Dplyr,Data Management,我一直在寻找这个问题的答案,但到目前为止运气不好。我的请求: 对于简单的数据帧: # create dummy data.frame d <- data.frame(var1 = as.character(1:5), var2 = factor(letters[1:5]), var3 = 1:5, stringsAsFactors = FALSE, var4 = rep("<div c

我一直在寻找这个问题的答案,但到目前为止运气不好。我的请求:

对于简单的数据帧:

# create dummy data.frame
d <- data.frame(var1 = as.character(1:5), 
                var2 = factor(letters[1:5]), 
                var3 = 1:5, stringsAsFactors = FALSE,
                var4 = rep("<div class='The mink cat'< /p>'",5))
如何根据变量类型/字符串内容重命名变量,而不引用原始列名,例如d[,1]或var1

将var1-var3重命名为每个变量中的值类型给定的字符、因子和数字

通过搜索变量值并利用字符串的一部分:“minkcat”,将var4重命名为“mink”

可能是这样的:

colnames(d) = lapply(d,class)
colnames(d)[sapply(d, function(x) any(grepl("cat",x)))] = "mink"
输出:

  character factor integer                            mink
1         1      a       1 <div class='The mink cat'< /p>'
2         2      b       2 <div class='The mink cat'< /p>'
3         3      c       3 <div class='The mink cat'< /p>'
4         4      d       4 <div class='The mink cat'< /p>'
5         5      e       5 <div class='The mink cat'< /p>'

如果最后一列被重命名为'mink',因为它包含'mink'。

正如我们前面评论的那样,解决方案是用sapply查找列的类,然后用该对象命名列'nm1',最后,取消第一行的列表,获取包含'mink'的列的索引,并将列名分配给'mink'

nm1 <- sapply(d, class)
names(d) <- nm1
names(d)[grep("mink", unlist(d[1,]))] <- "mink"
d
#  character factor integer                            mink
#1         1      a       1 <div class='The mink cat'< /p>'
#2         2      b       2 <div class='The mink cat'< /p>'
#3         3      c       3 <div class='The mink cat'< /p>'
#4         4      d       4 <div class='The mink cat'< /p>'
#5         5      e       5 <div class='The mink cat'< /p>'

使用purrr库可获得更简化的代码

library(purrr)
colnames(d) <- map_chr(d, class)

d

  character factor integer                       character
1         1      a       1 <div class='The mink cat'< /p>'
2         2      b       2 <div class='The mink cat'< /p>'
3         3      c       3 <div class='The mink cat'< /p>'
4         4      d       4 <div class='The mink cat'< /p>'
5         5      e       5 <div class='The mink cat'< /p>'
你是说nm1吗