2016-07-15 145 views
0

这是一个(无意义的)截断版本的R中的for-loop,用于计算某些多边形的土地使用情况。它很好地遍历数据,除非它应该使用plyr::rbind.fill()将计算绑定到data.frame。我得到了期望的结果,但也有(相同数量的)其他不需要的列填充了NA值(我想它与列名有关)。rbind列表到for循环中的data.frame

agri_coverage <- data.frame(matrix(rnorm(3), nrow=1)) 
set.seed(23) 
agri <- rnorm(10, 0.5) 

land_use <- NULL 
for (i in seq_along(agri)) { 
name <- agri[i] 
if (name > 1) { 
    wl <- as.list(unlist(agri_coverage[ ,1:3])) 
    } else { 
    wl <- as.list(rep(NA, 3)) 
    } 
    land_use <- rbind.fill(land_use, data.frame(wl)) #combine output 
} 

什么是最好的功能/方法将这些列表合并为一个数据框,为什么这些额外的列产生?

我试过其他功能,如rbind(),data.table::rbindlist()没有成功。

+2

'rbind.fill'(和它的dplyr后继'bind_rows')寻找同样的na mes为每个矢量对齐它们,而你的'NA's没有名字。如果你把'else'改成'wl < - as.list(setNames(rep(NA,3),names(agri_coverage)))',它就会起作用。更典型的基本方法是'do.call(rbind,lapply(agri,function(x){if(x> 1){agri_coverage} else {rep(NA,3)}}))' – alistaire

+0

我正在想办法复杂化。感谢您的解释! – andrasz

回答

1

您收到其他不需要的列中填充了NAs的原因是,您的else条件中创建的列表与您的if条件中的列表没有相同的名称。 rbind.fill将相同名称的列附加到彼此上,并且任何具有不同名称的列都用NA填充。来自rbind.fill帮助:

用NA填充填充缺失列的数据帧列表。

我觉得让你期望的结果,你可以简单地在你的其他条件末尾加上这一行:

names(wl) <- names(agri_coverage) 

的代码就变成了:

land_use <- NULL 
for (i in seq_along(agri)) { 
    name <- agri[i] 
    if (name > 1) { 
    wl <- as.list(unlist(agri_coverage[ ,1:3])) 
    } else { 
    wl <- as.list(rep(NA, 3)) 
    names(wl) <- names(agri_coverage) 
    } 
    land_use <- rbind.fill(land_use, data.frame(wl)) #combine output 
} 

导致:

land_use 
      X1  X2   X3 
1   NA  NA   NA 
2   NA  NA   NA 
3 0.2182885 -1.046535 -0.2886886 
4 0.2182885 -1.046535 -0.2886886 
5 0.2182885 -1.046535 -0.2886886 
6 0.2182885 -1.046535 -0.2886886 
7   NA  NA   NA 
8 0.2182885 -1.046535 -0.2886886 
9   NA  NA   NA 
10 0.2182885 -1.046535 -0.2886886