我正在尝试编写一个需要的函数:
我可以使用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)
也许x
有length == 1
,这可以解释为什么上面的代码只返回x2
的第一行,而不仅仅是最后一行,即我想要返回的行。
我可以在函数外轻松执行这些操作,但是如何在允许列名用作变量的函数中执行它们呢?谢谢你的任何建议。
答案 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)})