我得到了具有长变量名称的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
答案 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, " ", "")