忽略函数中不存在的表列

时间:2018-02-26 15:16:54

标签: r

我有一个简单的功能:

code_ppd_table <- function(n){
  table_1 <- cbind(t13[,n], t14[,n], t15[,n], t16[,n], t17[,n])
  colnames(table_1) <- c('cy13', 'cy14', 'cy15', 'cy16', 'cy17')
  table_1
}

在这个函数中,t13,t14等是表。当我运行该函数时,我从每个t13,t14等获得所需的表,其中列名为“n”(即表中有列t13 [,'n'],t14 [,'n']等) 。但是,如果其中一个表碰巧没有名为“n”的列(例如,如果t15 [,'n']不存在),我会收到错误。如何告诉R忽略任何没有列“n”的表,只给我其他的表?

1 个答案:

答案 0 :(得分:3)

您可以尝试tidyverse解决方案:

library(tidyverse)
# some data with n == hp  
t13 <- mtcars[1:4,]
t14 <- mtcars[11:14,]
t15 <- mtcars[11:14,-4]


# function and vector to change colnames
t_names <- c("t13", "t14", "t15")
change_colname <- function(df, new_colname){
  df %>% rename_all(funs(paste0(.,"_",new_colname)))
}

# code
list(t13, t14, t15) %>% 
  map2(.,t_names, ~change_colname(.x,.y)) %>% 
  bind_cols() %>% 
  select(starts_with("hp"))
  hp_t13 hp_t14
1    110    123
2    110    180
3     93    180
4    110    180

取决于您之后要对数据执行的操作,您还可以尝试按行绑定数据:

list(t13=t13, t14=t14, t15=t15) %>% 
  bind_rows(.id = "source") %>% 
  select(source, hp) %>% 
  filter(!is.na(hp))
  source  hp
1    t13 110
2    t13 110
3    t13  93
4    t13 110
5    t14 123
6    t14 180
7    t14 180
8    t14 180

您可以添加:

,而不是过滤步骤
list(t13=t13, t14=t14, t15=t15) %>% 
  bind_rows(.id = "source") %>% 
  select(source, hp) %>%
  group_by(source) %>% 
  mutate(n=row_number()) %>% 
  spread(source, hp)
# A tibble: 4 x 4
      n   t13   t14   t15
* <int> <dbl> <dbl> <dbl>
1     1   110   123    NA
2     2   110   180    NA
3     3    93   180    NA
4     4   110   180    NA