利用变量 values/types 重命名列
Leverage variable values/types to rename columns
我已经在 Whosebug 上搜索了这个问题的答案,但到目前为止还没有找到答案。我的要求:
对于一个简单的数据框:
# 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 重命名为字符、因子和数值,由每个变量中的值类型给出。
通过搜索变量值并利用字符串的一部分将 var4 重命名为 'mink':'the mink cat'。
可能是这样的:
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
的列的 class
,然后使用该对象 ('nm1') 命名列,最后,unlist
第一行,获取具有 '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>'
我已经在 Whosebug 上搜索了这个问题的答案,但到目前为止还没有找到答案。我的要求:
对于一个简单的数据框:
# 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 重命名为字符、因子和数值,由每个变量中的值类型给出。
通过搜索变量值并利用字符串的一部分将 var4 重命名为 'mink':'the mink cat'。
可能是这样的:
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
的列的 class
,然后使用该对象 ('nm1') 命名列,最后,unlist
第一行,获取具有 '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>'