忽略缺失列的函数

时间:2017-10-05 13:41:00

标签: r dplyr

说我有以下两个数据框:

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的例子,因为它们并不都遵循相同的重命名规则。如何忽略不存在的列?

1 个答案:

答案 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