所以我有数据框
povprecja.predmeti
并且在此data.frame中有名为:
的列 "krediti_razporejanje_n_2"
"krediti_razporejanje_n_3"
"krediti_razporejanje_n_4"
"krediti_razporejanje_n_5"
我想生成/定义另一个列名
krediti_razporejanje_n_1
,所以我将始终定义5个列名称。但由于数据帧不同,我希望使用dinamic代码,这意味着
我想找到哪个(从krediti_razporejanje_n_1到krediti_razporejanje_n_5)colname未定义并定义此列名称并用值0填充它。所以如果我的例子我正在mising列
krediti_razporejanje_n_1 which I would like to assign <- 0
我知道我可以手工完成,如:
povprecja.predmeti$krediti_razporejanje_n_1 <- rep(0,nrow(povprecja.predmeti))
但是我需要一个函数,所以如果我的数据只定义了两个colnames,那么找到1-5中的哪个是未定义的并定义它们。
我可以使用此代码找到哪一个
which(paste0("krediti_razporejanje_n_", 1:5) %in% colnames(povprecja.predmeti)==FALSE)
但我想要有恐龙功能。
答案 0 :(得分:2)
这是一个功能:
add_missing <- function(D, prefix, n){
current_names = names(D)
final_names = paste0(prefix, 1:n)
new_names = setdiff(final_names, current_names)
for(n in new_names){
D[[n]]=0
}
D = D[,order(names(D))]
D
}
测试:
> d=data.frame(x_2=1:5, x_3=1:5, x_4=1:5, x_5=1:5)
> d
x_2 x_3 x_4 x_5
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
> d = add_missing(d, "x_", 5)
> d
x_1 x_2 x_3 x_4 x_5
1 0 1 1 1 1
2 0 2 2 2 2
3 0 3 3 3 3
4 0 4 4 4 4
5 0 5 5 5 5
如果没有遗漏列,请检查它是否会失败:
> add_missing(d, "x_", 5)
x_1 x_2 x_3 x_4 x_5
1 0 1 1 1 1
2 0 2 2 2 2
3 0 3 3 3 3
4 0 4 4 4 4
5 0 5 5 5 5
现在剁几列,看看会发生什么:
> d=d[,c(1,2,5)]
> d
x_1 x_2 x_5
1 0 1 1
2 0 2 2
3 0 3 3
4 0 4 4
5 0 5 5
> add_missing(d, "x_", 5)
x_1 x_2 x_3 x_4 x_5
1 0 1 0 0 1
2 0 2 0 0 2
3 0 3 0 0 3
4 0 4 0 0 4
5 0 5 0 0 5
另一个测试:
> add_missing(d, "x_", 7)
x_1 x_2 x_3 x_4 x_5 x_6 x_7
1 0 1 0 0 1 0 0
2 0 2 0 0 2 0 0
3 0 3 0 0 3 0 0
4 0 4 0 0 4 0 0
5 0 5 0 0 5 0 0
答案 1 :(得分:1)
miscol <- function(x){
# x = data.frame
missing <- paste0("krediti_razporejanje_n_",1:5)[paste0("krediti_razporejanje_n_", 1:5) %in% colnames(x) == FALSE]
res <- list()
for(i in missing){
res[[i]] <- rep(0,nrow(x))
}
new <- data.frame(x,res)
return(new[,sort(colnames(new))])
}
由于我是新用户且无法发表评论,我想我必须回答。但这应该做你想做的事。
可能有一种更好的方法,而不是使用空列表来编写新列。但是这将删除所有缺少的列名,给它们全部为零并将其写回新的数据框。
答案 2 :(得分:0)
谢谢@TJGorrie。我使用了你的代码并稍微修改了一下,所以我的例子中的工作解决方案是:
if (any(paste0("krediti_razporejanje_n_", 1:5) %in% colnames(povprecja.predmeti)==FALSE)) { # x = data.frame missing <- paste0("krediti_razporejanje_n_",1:5)[paste0("krediti_razporejanje_n_", 1:5) %in% colnames(povprecja.predmeti) == FALSE] res <- list() for(i in missing){ povprecja.predmeti[[i]] <- rep(0,nrow(povprecja.predmeti)) } }