说我有以下两个数据框:
col1 <- c("a","b","c","d","e")
col2 <- c("A","B","C","D","E")
col1a <- c("a","b","c","d","e")
col2a <- c("A","B","C","D","E")
df1 <- data.frame(col1, col2)
df2 <- data.frame(col1a, col2a)
colnames(df1) <- c("c1","c2")
colnames(df2) <- c("c1","c3")
我有以下功能来重命名列标题:
library(dplyr)
col_rename <- function(x) x %>% rename(new_c1 = c1, new_c2 = c2, new_c3 = c3)
当我运行此函数时,我收到错误,因为函数中的列与数据框中的列不匹配。
df1 <- col_rename(df1)
Error: `c3` contains unknown variables
如何在不删除或更改函数中指定的列名的情况下,使函数仅在当前列上运行,并忽略不存在的函数?
编辑:
我可以看到这个例子有点令人困惑。我有很多列有很多列的数据帧。这些列由某些数据帧共享,但不是全部。但是,我想重命名该函数指定的所有列,无论数据帧中存在什么。它看起来像这样:
col1 <- c(1:5)
col2 <- c(1:5)
col3 <- c(1:5)
col4 <- c(1:5)
df1 <- data.frame(col1,col2,col3,col4)
df2 <- data.frame(col1,col2,col3,col4)
colnames(df1) <- c("c1","c2","c6","c8")
colnames(df2) <- c("c1","c3","c2","c8")
AB_rename <- function(x) x %>% rename(aa=col1,bb=col2,
cc=col3,dd=col4,
ee=col5,ff=col6,
gg=col7,hh=col8)
因此我不能遵循@Ycw的例子,因为它们并不都遵循相同的重命名规则。如何忽略不存在的列?
答案 0 :(得分:3)
以下是对repr
函数使用setNames
的解决方法。
col_rename
或使用col_rename <- function(x) setNames(x, paste0("new_", names(x)))
col_rename(df1)
new_c1 new_c2
1 a A
2 b B
3 c C
4 d D
5 e E
col_rename(df2)
new_c1 new_c3
1 a A
2 b B
3 c C
4 d D
5 e E
中的select_all
功能。
dplyr
此(library(dplyr)
df1 %>% select_all(function(x) paste0("new_", x))
new_c1 new_c2
1 a A
2 b B
3 c C
4 d D
5 e E
)也适用于~
select_all
df2 %>% select_all(~paste0("new_", .))
new_c1 new_c3
1 a A
2 b B
3 c C
4 d D
5 e E
也很有效
rename_all
这是解决OP更新问题的更新。
我们可以创建一个命名向量,显示旧列名和新列名之间的关系。并定义了一个基于library(dplyr)
df1 %>% rename_all(~paste0("new_", .))
new_c1 new_c2
1 a A
2 b B
3 c C
4 d D
5 e E
函数更改名称的函数。
setNames