0

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

  1. 将列名视为变量
  2. 获取列的长度(或访问最后一行)
  3. 对列中的行子集求和

我可以用 做第 1 步sapply,但我被困在第 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)

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

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

4

1 回答 1

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)})
于 2013-08-05T16:07:12.513 回答