找出未定义的组合名称并创建它们

时间:2016-01-28 10:48:24

标签: r

所以我有数据框

povprecja.predmeti

enter image description here

并且在此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)

但我想要有恐龙功能。

3 个答案:

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