我有一个简单的功能:
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”的表,只给我其他的表?
答案 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