我有一个名为X的多列(超过500列(的tibble,这些列以"X"+整数的格式命名。蒂布尔看起来像这样。
# A tibble: 7,352 x 561
X1 X2 X3 X4 X5 X6
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.289 -0.0203 -0.133 -0.995 -0.983 -0.914
2 0.278 -0.0164 -0.124 -0.998 -0.975 -0.960
txt 文件不包含列名,但它们位于另一个 txt 文件中,我已经读到了另一个 tibble。这个小圈子的大小为 561x1。
我想做的是使用行值重命名 tibble x 的所有列名(=将 tibble 转换为名为 y 的字符向量(。
我尝试过 dplyr 函数rename_all但没有结果。
这是一个我认为非常接近实际工作的示例,但我不太了解如何使用函数列表
> rename_all(x,list(paste0(y)))
RStudio 命令行中的上述命令生成以下错误消息:
Error in get(.x, .env, mode = "function") :
object 'tBodyAcc-mean()-X' of mode 'function' was not found
tBodyAcc-mean()-X
是字符向量 y 的第一行中的值。
我试图在谷歌上搜索错误消息,但到目前为止,我不知道是什么原因造成的,以及我应该如何修改rename_all命令以使其正常工作。
任何帮助都非常感谢!
您可以使用:
library(dplyr)
x %>% rename_all(~y %>% pull(col))
# a b c d e f
#1 0.289 -0.0203 -0.133 -0.995 -0.983 -0.914
#2 0.278 -0.0164 -0.124 -0.998 -0.975 -0.960
或者干脆在基数R中:
names(x) <- y$col
其中col
是数据框中y
列名。
数据
x <- structure(list(X1 = c(0.289, 0.278), X2 = c(-0.0203, -0.0164),
X3 = c(-0.133, -0.124), X4 = c(-0.995, -0.998), X5 = c(-0.983,
-0.975), X6 = c(-0.914, -0.96)), class = "data.frame", row.names = c("1", "2"))
y <- tibble(col = letters[1:6])
基于正确建议的基本 R 解决方案,我编写了一个与管道兼容的小函数来完成这项工作:
set_names <- function(x, colnames) {
# Do some checks
if (! "data.frame" %in% class(x)) stop("Argument must be a data.frame")
if (class(colnames) != "character") stop("New names must be character")
if (length(names(x)) != length(colnames)) stop("Invalid nr. of new names")
# Actual replacement of column names
names(x) <- colnames
return(x)
}
用法示例:
X <- read_xslx(fname,sname) %>% # Read the data
select(1:2) %>% # Use only first 2 columns
set_names(c("name","value")) %>% # set proper name
filter(value>5) # select data of interest
使用rename_at
,您可以编写以下代码:
x1 <- x %>%
rename_at(., names(x), funs(c(letters[1:6])))