将后续列向上移动一个额外的位置,从 R 中的特定列开始(滞后)
Shifting subsequent columns up an additional position starting with a certain column in R (lag)
我有这个数据
structure(list(Year = structure(1:11, .Label = c("2008", "2009",
"2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017",
"2018"), class = "factor"), Age0 = c(1.85714285714286, 0.4, 0.485714285714286,
1.1, 2.42857142857143, 0.257142857142857, 0.0428571428571429,
0.314285714285714, 0.716666666666667, 0.833333333333333, 2.51666666666667
), Age1 = c(NA, NA, 0.0909090909090909, NA, 0.115384615384615,
0.157894736842105, 0.0666666666666667, 0.239130434782609, 0.0862068965517241,
0.135802469135802, 0.154639175257732), Age2 = c(NA, NA, 0.181818181818182,
0.25, 0.0384615384615385, 0.315789473684211, 0.0666666666666667,
0.260869565217391, 0.258620689655172, 0.209876543209877, 0.298969072164948
), Age3 = c(NA, NA, NA, NA, 0.0769230769230769, 0.157894736842105,
0.533333333333333, 0.282608695652174, 0.224137931034483, 0.160493827160494,
0.298969072164948), Age4 = c(NA, NA, NA, NA, 0.153846153846154,
0.157894736842105, 0.133333333333333, 0.173913043478261, 0.137931034482759,
0.123456790123457, 0.134020618556701), Age5 = c(NA, NA, NA, NA,
NA, 0.105263157894737, 0.2, 0.152173913043478, 0.103448275862069,
0.0987654320987654, 0.0618556701030928), Age6 = c(NA, NA, NA,
NA, NA, NA, NA, 0.108695652173913, 0.120689655172414, 0.037037037037037,
0.0824742268041237), Age7 = c(NA, NA, NA, NA, NA, NA, NA, 0.0652173913043478,
0.0689655172413793, 0.0617283950617284, 0.0103092783505155),
Age8 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.0493827160493827,
0.0103092783505155), Age9 = c(NA, NA, NA, NA, NA, NA, NA,
NA, NA, 0.0123456790123457, 0.0309278350515464)), class = "data.frame", row.names = c(NA,
-11L))
我正在尝试做一些与此非常相似的事情...
使用此代码...
wi.v.hog.prop2 <- setDT(wi.v.hog.prop2)
for (i in 3:length(wi.v.hog.prop2)) wi.v.hog.prop2[,i] <- shift(wi.v.hog.prop2[,i,with=F],(i-1),NA,"lead")
我让它开始移动正确的列(年龄 1),但它向上移动太多了。它应该只向上移动一位,那么 Age2 应该向上移动 2 位。
看起来这段代码是从正确的年龄开始的,但偏移量基于目标列与第一列的列数。因此,由于 Age1 是第 3 列,它向上移动了 2 个位置,Age2 是第 4 列,它向上移动了 3 个位置。我只需要少一个班次。谢谢
你可以用 Map
来做到这一点:
library(data.table)
setDT(df)
df[, paste0('Age', 1:9) := Map(function(x, y) shift(x, y, 0, 'lead'),
.SD, 1:9), .SDcols = 3:ncol(df)]
或使用 tidyverse
函数:
df[paste0('Age', 1:9)] <- purrr::map2(df[3:ncol(df)], 1:9, dplyr::lead,
default = 0)
我有这个数据
structure(list(Year = structure(1:11, .Label = c("2008", "2009",
"2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017",
"2018"), class = "factor"), Age0 = c(1.85714285714286, 0.4, 0.485714285714286,
1.1, 2.42857142857143, 0.257142857142857, 0.0428571428571429,
0.314285714285714, 0.716666666666667, 0.833333333333333, 2.51666666666667
), Age1 = c(NA, NA, 0.0909090909090909, NA, 0.115384615384615,
0.157894736842105, 0.0666666666666667, 0.239130434782609, 0.0862068965517241,
0.135802469135802, 0.154639175257732), Age2 = c(NA, NA, 0.181818181818182,
0.25, 0.0384615384615385, 0.315789473684211, 0.0666666666666667,
0.260869565217391, 0.258620689655172, 0.209876543209877, 0.298969072164948
), Age3 = c(NA, NA, NA, NA, 0.0769230769230769, 0.157894736842105,
0.533333333333333, 0.282608695652174, 0.224137931034483, 0.160493827160494,
0.298969072164948), Age4 = c(NA, NA, NA, NA, 0.153846153846154,
0.157894736842105, 0.133333333333333, 0.173913043478261, 0.137931034482759,
0.123456790123457, 0.134020618556701), Age5 = c(NA, NA, NA, NA,
NA, 0.105263157894737, 0.2, 0.152173913043478, 0.103448275862069,
0.0987654320987654, 0.0618556701030928), Age6 = c(NA, NA, NA,
NA, NA, NA, NA, 0.108695652173913, 0.120689655172414, 0.037037037037037,
0.0824742268041237), Age7 = c(NA, NA, NA, NA, NA, NA, NA, 0.0652173913043478,
0.0689655172413793, 0.0617283950617284, 0.0103092783505155),
Age8 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.0493827160493827,
0.0103092783505155), Age9 = c(NA, NA, NA, NA, NA, NA, NA,
NA, NA, 0.0123456790123457, 0.0309278350515464)), class = "data.frame", row.names = c(NA,
-11L))
我正在尝试做一些与此非常相似的事情...
使用此代码...
wi.v.hog.prop2 <- setDT(wi.v.hog.prop2)
for (i in 3:length(wi.v.hog.prop2)) wi.v.hog.prop2[,i] <- shift(wi.v.hog.prop2[,i,with=F],(i-1),NA,"lead")
我让它开始移动正确的列(年龄 1),但它向上移动太多了。它应该只向上移动一位,那么 Age2 应该向上移动 2 位。
看起来这段代码是从正确的年龄开始的,但偏移量基于目标列与第一列的列数。因此,由于 Age1 是第 3 列,它向上移动了 2 个位置,Age2 是第 4 列,它向上移动了 3 个位置。我只需要少一个班次。谢谢
你可以用 Map
来做到这一点:
library(data.table)
setDT(df)
df[, paste0('Age', 1:9) := Map(function(x, y) shift(x, y, 0, 'lead'),
.SD, 1:9), .SDcols = 3:ncol(df)]
或使用 tidyverse
函数:
df[paste0('Age', 1:9)] <- purrr::map2(df[3:ncol(df)], 1:9, dplyr::lead,
default = 0)