r - 从 R 中的某个列开始将后续列向上移动一个额外的位置(滞后)
问题描述
我有这个数据
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)
推荐阅读
- vim - 执行“参数”\r(回车)不起作用
- jquery - jQuery 检查 CSS 类的高度是否小于 20%
- graphql - 如何从后端消息队列应用程序触发 GraphQL 订阅
- java - 使用 jGit 将文件推送到远程存储库
- javascript - 发布了一个 npm 包,但安装它只有基本文件
- c++ - 如何使用模板构造函数定义推导指南?
- node.js - React Native - 如何使两个设备在连接到同一网络时相互通信?
- php - 如何为我的联系表创建确认页面?
- ruby - ActiveRecord::StatementInvalid: 找不到表'users' Rails 5 教程
- python - 当我的玩家在pygame中碰撞时如何让我的玩家穿过敌人?