使用lapply时函数抛出错误,否则工作正常

时间:2016-10-27 21:33:52

标签: r function data.table lapply

我有一个包含数据表的列表。可以使用以下代码创建示例列表。

mydata=read.table(textConnection("
MSA_id   code variable Caucasian African.American Asian Hispanic Other
412 111011        1        64                2     0        0     0
412 111011        2       464               17     4       11     0
412 111021        1      2006               43    32       22    61
412 111021        2       559               18     6       10     0
412 111031        1        56                1     0        0     0
412 111031        2         1                0     0        0     0"),header=TRUE) 
setDT(mydata) 
z = split(mydata,mydata$code)

> z[1:2]
$`111011`
   MSA_id   code variable Caucasian African.American Asian Hispanic Other
1:    412 111011        1        64                2     0        0     0
2:    412 111011        2       464               17     4       11     0

$`111021`
   MSA_id   code variable Caucasian African.American Asian Hispanic Other
1:    412 111021        1      2006               43    32       22    61
2:    412 111021        2       559               18     6       10     0

我想根据它们的值重新格式化此列表(data.tables)的元素。 从我的代码中,重新格式化列表的元素应该是这样的: 第一元素:

     [,1] [,2]
[1,]   64    2
[2,]  464   32

第二元素

   Caucasian African.American Asian Hispanic
1:      2006               43    32       22
2:       559               18     6       10

算法是:

  1. 删除前3列和最后一列。
  2. 如果高加索人的最小值是0,或者休息的最小值之和 3(即:African.American,Asian,Hispanic)类别为0,则 将元素设置为NA。
  3. 否则,如果African.American的最小值为0或最小值之和为 亚洲和西班牙裔是0,然后总结非洲。美国,亚洲和 西班牙裔为单一类别。
  4. 如果亚洲人的最小值为0或西班牙裔的最小值为 0,总结亚洲和西班牙裔为单一类别。
  5. 否则保持格式原样。
  6. 我创建了一个功能来完成它。当我一次在一个元素上使用此函数时,它工作正常,但是当我使用lapply时,它会中断。

    formatTable <- function(z){ 
        a = z[[1]]
        b = a[,list(Caucasian,African.American,Asian,Hispanic),] # Deleting columns 1,2,3 and 8
    
        if ( min(b$Caucasian) == 0) {
           formatTable=NA
        } else if ( (min(b$African.American) + min(b$Asian) + min(b$Hispanic)) == 0) {
           formatTable=NA
        } else if ( (min(b$African.American) == 0) | (min(b$Asian) + min(b$Hispanic)==0)) {
           formatTable = cbind(b$Caucasian, b$African.American+b$Asian+b$Hispanic)
        } else if ( min(b$Asian)==0 | min(b$Hispanic)==0) {
           formatTable = cbind(b$Caucasian, b$African.American, b$Asian+b$Hispanic)
        } else
           formatTable = b
    }
    

    使用此功能,t1=formatTable(z[1])t2=formatTable(z[2])会得到正确的结果,但如果我使用tbls = lapply(z[1:2],formatTable)则会显示Error in FUN(X[[1L]], ...) : object 'Caucasian' not found

    请帮助解释为什么lapply会抛出此错误。

0 个答案:

没有答案