r语言 - 在 for 循环中使用 diff 函数



我有一个数据帧,我想生成具有前面差异的列。即有一列新列,第 1 列 - 第 2 列,下一个是第 2 列 - 第 3 列,依此类推。我已经写出了代码(~伪代码?(,但我不完全确定如何正确格式化它。这将是不同文档的管道,因此我无法对列名或编号进行硬编码。我还希望这个循环生成一个新列,其标题具有减去的列的名称。

我的数据:

Line_1    Line_2    Line_3    Line_4    Line_5    Line_6    Line_7
1         NA        NA        NA        NA        NA 0.0000000        NA
2  0.4054731 0.3193632 0.2667026 0.8494675 0.2394639 0.2936054 0.2453124
3  0.4048527 0.3195507 0.2693250 0.8664931 0.2380499 0.2931895 0.2437657
4  0.4041760 0.3226145 0.2731347 0.8756971 0.2338797 0.2876017 0.2432391
5  0.4079322 0.3264623 0.2750645 0.8770746 0.2273580 0.2866682 0.2476563

我的"代码":

for (n in 1:ncol(tempDF2)) {
sub <- diff(n, lag = 1, differences = 1)
name <- paste0(n, " - ", n+1)
tempDF2$name <- sub
}

我怎样才能让它工作?我也愿意申请循环的替代方案等。

您可以使用matrixStats包中的rowDiffs并反转差异:

library(matrixStats)
df <- structure(list(Line_1 = c(NA, 0.4054731, 0.4048527, 0.404176, 
0.4079322), Line_2 = c(NA, 0.3193632, 0.3195507, 0.3226145, 0.3264623
), Line_3 = c(NA, 0.2667026, 0.269325, 0.2731347, 0.2750645), 
Line_4 = c(NA, 0.8494675, 0.8664931, 0.8756971, 0.8770746
), Line_5 = c(NA, 0.2394639, 0.2380499, 0.2338797, 0.227358
), Line_6 = c(NA, 0.2936054, 0.2931895, 0.2876017, 0.2866682
), Line_7 = c(0, 0.2453124, 0.2437657, 0.2432391, 0.2476563
)), class = "data.frame", row.names = c(NA, -5L))
-rowDiffs(as.matrix(df))
#>           [,1]      [,2]       [,3]      [,4]       [,5]      [,6]
#> [1,]        NA        NA         NA        NA         NA        NA
#> [2,] 0.0861099 0.0526606 -0.5827649 0.6100036 -0.0541415 0.0482930
#> [3,] 0.0853020 0.0502257 -0.5971681 0.6284432 -0.0551396 0.0494238
#> [4,] 0.0815615 0.0494798 -0.6025624 0.6418174 -0.0537220 0.0443626
#> [5,] 0.0814699 0.0513978 -0.6020101 0.6497166 -0.0593102 0.0390119

编辑:

如果与您的问题相反,您想要Line_2 - Line_1等的差异,那么它将是:

setNames(data.frame(rowDiffs(as.matrix(df))), 
paste0(colnames(df)[-1], "-", colnames(df)[-ncol(df)]))
#>   Line_2-Line_1 Line_3-Line_2 Line_4-Line_3 Line_5-Line_4 Line_6-Line_5
#> 1            NA            NA            NA            NA            NA
#> 2    -0.0861099    -0.0526606     0.5827649    -0.6100036     0.0541415
#> 3    -0.0853020    -0.0502257     0.5971681    -0.6284432     0.0551396
#> 4    -0.0815615    -0.0494798     0.6025624    -0.6418174     0.0537220
#> 5    -0.0814699    -0.0513978     0.6020101    -0.6497166     0.0593102
#>   Line_7-Line_6
#> 1            NA
#> 2    -0.0482930
#> 3    -0.0494238
#> 4    -0.0443626
#> 5    -0.0390119

创建于 2020-07-01 由 reprex 软件包 (v0.3.0(

不确定这是否正是您要查找的内容,但以下函数将按顺序计算第 1 列与第 n列之间的差异。这显然仅适用于具有数字列的数据框。你可以通过dplyr和动态变量命名(即enquo()(,但这可能会让你朝着正确的方向前进。

diff_cols <- function(dat) {
list <- names(dat)
col <- list()
nam <- vector()
for(i in 1:(ncol(dat)-1)) {
col[[i]] <- dat[,i]-dat[,i+1] 
nam[i] <- paste0(list[i], "-" ,list[i+1])
}
df <- as.data.frame(do.call(cbind, col))
colnames(df) <- nam 
return(df)
}
dat <- select_if(iris, is.numeric)
diff_cols(dat)

base R中,我们可以通过取大小相等的 data.frame 的差值(通过删除第一列和最后一列(来做到这一点。

out <- tempDF2[-ncol(tempDF2)] - tempDF2[-1]
names(out) <- paste0(names(tempDF2)[-1], "-", names(tempDF2)[-ncol(tempDF2)]) 

out
#  Line_2-Line_1 Line_3-Line_2 Line_4-Line_3 Line_5-Line_4 Line_6-Line_5 Line_7-Line_6
#1            NA            NA            NA            NA            NA            NA
#2     0.0861099     0.0526606    -0.5827649     0.6100036    -0.0541415     0.0482930
#3     0.0853020     0.0502257    -0.5971681     0.6284432    -0.0551396     0.0494238
#4     0.0815615     0.0494798    -0.6025624     0.6418174    -0.0537220     0.0443626
#5     0.0814699     0.0513978    -0.6020101     0.6497166    -0.0593102     0.0390119

数据

tempDF2 <- structure(list(Line_1 = c(NA, 0.4054731, 0.4048527, 0.404176, 
0.4079322), Line_2 = c(NA, 0.3193632, 0.3195507, 0.3226145, 0.3264623
), Line_3 = c(NA, 0.2667026, 0.269325, 0.2731347, 0.2750645), 
Line_4 = c(NA, 0.8494675, 0.8664931, 0.8756971, 0.8770746
), Line_5 = c(NA, 0.2394639, 0.2380499, 0.2338797, 0.227358
), Line_6 = c(NA, 0.2936054, 0.2931895, 0.2876017, 0.2866682
), Line_7 = c(0, 0.2453124, 0.2437657, 0.2432391, 0.2476563
)), class = "data.frame", row.names = c(NA, -5L))

最新更新