Dplyr或Magrittr - tolower?

31

在 dplyr 或 magrittr 链中,是否可以将所有列名称设置为大写或小写?

在下面的示例中,我加载数据,然后使用 magrittr 管道将其链接到我的 dplyr 变换中。在第4行中,我使用 tolower 函数,但这是出于不同的目的:创建一个具有小写观察值的新变量。

mydata <- read.csv('myfile.csv') %>%
    mutate(Year = mdy_hms(DATE),
           Reference = (REFNUM),
           Event = tolower(EVENT)

我显然正在寻找类似于colnames = tolower的东西,但知道这并不存在/不起作用。

我注意到dplyr的rename函数,但这并没有什么帮助。

在magrittr中,列名选项为:

set_colnames代替基础R的colnames<-
set_names代替基础R的names<-

我已尝试了这些选项的许多排列组合,但都没有成功。

显然,在基础R中非常简单。

names(mydata) <- tolower(names(mydata))

然而,这似乎与/的理念不相符,因为你不得不使用笨重的一行代码,然后才能转到优雅的dplyr/magrittr代码链。


1
请参考@Moody_Mudskipper的答案了解更多关于dplyr::rename_all()的内容。 - Cristian E. Nuno
5个回答

72

使用 {dplyr} 我们可以做到:

mydata %>% rename_with(tolower)

rename_all() 可以用于相同的效果,但已被取代。


似乎受到列数的限制: - user1767316
我在10k列中没有看到这个问题,你有多少列? - moodymudskipper
1
在我的情况下,是5505列和19425行,但我忘记了它是通过sparklyr访问的Spark RDD。 - user1767316

25
iris %>% setNames(tolower(names(.))) %>% head

或者等价地,在非替换形式中使用替换函数:

iris %>% `names<-`(tolower(names(.))) %>% head
iris %>% `colnames<-`(tolower(names(.))) %>% head  # if you really want to use `colnames<-`

22

如果我理解你的问题正确,使用magrittr的"复合赋值管道运算符"%<>%可能是一种更加简洁的选择。

library("magrittr")
names(iris) %<>% tolower

?`%<>%` # for more

2
mtcars %>% 
set_colnames(value = casefold(colnames(.), upper = FALSE)) %>% 
head

casefold 在基础 R 中可用,可以通过使用标志 upper 将文本转换为全大写或全小写,以满足需要。

此外,colnames() 仅会使用列标题进行大小写转换。


2
casefold是一种包装器,用于与S-PLUS兼容,并提供tolower和toupper功能。 - Rich Scriven

2

You could also define a function:

upcase <- function(df) {
  names(df) <- toupper(names(df))
  df
}

library(dplyr)

mtcars %>% upcase %>% select(MPG)

在我看来,这是最佳解决方案。我将此函数命名为 names_to_upper(第二个为 names_to_lower),colnames_ 也不错:mtcars%>% colnames_to_upper%>% select(MPG) - Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接