2017-08-03 36 views
2

我已經搜索了這個問題的答案stackoverflow,但迄今沒有運氣。我的要求:利用變量值/類型來重命名列

對於一個簡單的數據幀:

# 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重命名爲'貂'。

+0

你意'NM1 < - sapply(d,類); 名稱(d)[1:3] < - nm1 [1:3]' – akrun

回答

1

正如我們在前面的評論中,解決辦法是找到sapply列的class,然後將其命名與對象(「NM1」)的列,最後,unlist第一行,得到有列的索引'貂' 和分配列名稱爲 '貂'

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>' 
1

也許是這樣的:

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>' 

當最後一列被重命名爲 '貂',因爲它包含了 '貂'。

2

使用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>'