在data.frame中更改长变量名称

时间:2017-10-19 00:04:59

标签: r

我得到了具有长变量名称的data.frame df

每个名字的第一部分是主要类别(岩石,土壤,土地用途),第二部分通常由多个名称组成(例如岩石,2级为sandstone mudstone basalt chert limestone和{ {1}})。

sandstone conglomerate coquina tephra

我想通过使用每个单词的第一个字母来缩短变量名称,如下所示。 我可以使用例如> df # A tibble: 5 x 2 `rock_sandstone conglomerate coquina tephra` `rock_sandstone mudstone basalt chert limestone` <dbl> <dbl> 1 0.000000 18.774037 2 41.968310 30.276509 3 32.804031 0.000000 4 8.669436 3.092062 5 32.937377 19.894776 来做到这一点。但是,我有97个变量,我想对20个具有不同变量名称的data.frames做同样的事情。我想知道是否有更快的方法。

dplyr::rename

数据

library(dplyr)
df <- df %>% rename("r_sccat"  = 'rock_sandstone conglomerate coquina tephra',
                    "r_smbcl" =  "rock_sandstone mudstone basalt chert limestone")

> df
# A tibble: 5 x 2
    r_sccat   r_smbcl
      <dbl>     <dbl>
1  0.000000 18.774037
2 41.968310 30.276509
3 32.804031  0.000000
4  8.669436  3.092062
5 32.937377 19.894776

3 个答案:

答案 0 :(得分:3)

有点难看,但abbreviate和一些正则表达式替换会让你到达那里:

names(df) <- sub("^(.)", "\\1_", abbreviate(gsub("_", " ", names(df))))
df

## A tibble: 5 × 2
#     r_scct   r_smbcl
#      <dbl>     <dbl>
#1  0.000000 18.774037
#2 41.968310 30.276509
#3 32.804031  0.000000
#4  8.669436  3.092062
#5 32.937377 19.894776

答案 1 :(得分:2)

我对缩写不熟悉,但同样可以通过一些正则表达式替换来实现:

names( df ) <- gsub( ' ', "", gsub( "([a-z])([a-z]+)", "\\1", names( df ) ) )

使用magrittr可以获得更清晰的语法:

require( magrittr )
names( df ) %<>%
    gsub( "([a-z])([a-z]+)", "\\1", . ) %>%
    gsub( " ", "", . )

答案 2 :(得分:0)

这可以通过使用 Hadley Wickham 的 stringr 包中的文本清理函数和 Ingo Feinerer 和 Kurt Hornik 的 tm 包中的文本挖掘函数来完成。我使用 dplyr 作为方便的管道操作符。

假设您有一个包含长列名称的字符向量的数据集:

lbl.lst$LongNames

library(tm)
library(dplyr)
library(stringr)

# 1. Create a list of filler words you want removed. 
# You can add to the list provided by tm using the following code. 

all_stopwrds<- c("words","you","want","removed",stopwords("en"))

# 2. Create a corpus (dataset with your text labels). 
# Use the tm::tm_map functions to remove filler words, shorten words to their stems, 
# remove hyphens, numbers, and extra spaces).

z <- Corpus(VectorSource(lbl.lst$LongNames)) %>%
     tm_map(removeWords, all_stopwrds) %>%
     tm_map(stemDocument) %>%
     tm_map(removePunctuation) %>%
     tm_map(removeNumbers) %>%
     tm_map(stripWhitespace) 


# 3. Flatten out the corpus to capitalize the first word in each string. Then
# Choose the first few words (three generally works for me) and 
# concatenate to get your new variables into CamelCase.  

z <- as.data.frame(do.call(rbind, lapply(z, as.data.frame)))  
z[,1] <- str_to_title(z[,1]) 
z$first3 <- word(z[,1], 1,3, sep=" ")
z$ShortName <- str_replace_all(z$first3, " ", "")