使用sapply获取函数内的向量长度

时间:2013-08-04 19:56:50

标签: r sapply

我正在尝试编写一个需要的函数:

  1. 将列名称视为变量
  2. 获取列的长度(或访问最后一行)
  3. 汇总列中的行子集
  4. 我可以使用sapply执行第1步,但我仍然坚持第2步。如何获取向量的长度?下面是一个示例数据集。

    my.data <- read.table(text = '
       y1970  y1980  y1990
           5      7      9
          50     70     90
         500    700    900
        5000   7000   9000
    ', header = TRUE, na.string='NA', stringsAsFactors=FALSE)
    

    步骤2的期望结果是:

    5000   7000   9000
    

    第3步的结果是:

    4445  6223  8001
    

    以下是第2步的功能:

    my.function <- function(x) { 
         names.x <- as.character(colnames(my.data)[x])
         x2 <- my.data[[x]][length(x)]   # returns first row of my.data
         return(x2=x2)
    }
    sapply(1:ncol(my.data), function(x) {my.function(x)})
    
    # possible code for Step 3 if I get Step 2 to work:
    (x2 - sum(my.data[[x]][1:(length(my.data[[x]])-1)], na.rm=TRUE)
    

    也许xlength == 1,这可以解释为什么上面的代码只返回x2的第一行,而不仅仅是最后一行,即我想要返回的行。

    我可以在函数外轻松执行这些操作,但是如何在允许列名用作变量的函数中执行它们呢?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:0)

以下是第2步的代码。

my.function <- function(x) { 
     names.x <- as.character(colnames(my.data)[x])
     x2 <- my.data[[x]][length(my.data[[x]])]
     return(x2=x2)
}
sapply(1:ncol(my.data), function(x) {my.function(x)})

[1] 5000 7000 9000

以下是所有三个步骤的代码:

my.function <- function(x) { 
     names.x <- as.character(colnames(my.data)[x])
     x2 <- my.data[[x]][length(my.data[[x]])]
     x3 <- x2 - (sum(my.data[[x]], na.rm=TRUE) - x2)
     return(x3)
}
sapply(1:ncol(my.data), function(x) {my.function(x)})

[1] 4445 6223 8001

以下是@flodel建议但在函数内部实现的解决方案的代码:

my.function <- function(x) { 
     names.x <- as.character(colnames(my.data)[x])
     x2 <- tail(my.data[[x]],1) - sum(head(my.data[[x]], -1))
     return(x2)
}
sapply(1:ncol(my.data), function(x) {my.function(x)})