r - 忽略缺失列的函数

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

最佳答案

以下是使用 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

或者使用 dplyr 中的 select_all 函数。

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 也很好用

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

更新

这是解决OP更新问题的更新。

我们可以创建一个命名向量来显示旧列名和新列名之间的关系。并在setNames函数的基础上定义了一个更改名称的函数。

# Create name vector
vec <- paste0("c", 1:8)
names(vec) <- c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh")

# Create the function
AB_rename <- function(x, name_vec){
  old_colname <- names(x)
  new_colname <- name_vec[name_vec %in% old_colname]
  x2 <- setNames(x, names(new_colname))
  return(x2)
}

AB_rename(df1, vec)
  aa bb ff hh
1  1  1  1  1
2  2  2  2  2
3  3  3  3  3
4  4  4  4  4
5  5  5  5  5

关于r - 忽略缺失列的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46587163/

相关文章:

r - 可以 "save"dplyr函数供以后使用吗?

r - 如何计算R中按列后缀分组的多行均值

r - 多个时间点分组受试者的百分比变化 R

r - 在 R 中转换字符串

r - 从优势比和置信区间进行 Meta 分析,在 r 中使用 metafor 包

r - 一起使用汇总、交叉和分位数函数

r - 选择具有特定条件的子数据集,而不使用应用和子集函数

r - “记者”不可用

R cummax函数与NA

r - 通过包含级别计算平均值 - 基于整个组扩展窗口