繁体   English   中英

如何在 R(dplyr 或 data.table)中移动值?

[英]How shift values in rows in R (dplyr or data.table)?

这是“转移前”和“转移后”的数据集。

# Data set 'before'
df_before <- t(data.table(
  x = c(1, 2, 3, 4, 5),
  y = c(0, 6, 7, 8, 9),
  z = c(0, 0, 11, 12, 13)))

# Shift operation
# ...

# Data set 'after'
df_after <- t(data.table(
  x = c(1, 2, 3, 4, 5),
  y = c(6, 7, 8, 9, NA),
  z = c(11, 12, 13, NA, NA)))

如何仅对所有行在 +1 单元格上进行这种移动?

谢谢!

像这样的东西? 刚开始的行总是移动一并重置它们的length 后者添加了NA

t(sapply(1:nrow(DF), function(x) `length<-`(DF[x, x:ncol(DF)], ncol(DF))))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    3    4    5
# [2,]    6    7    8    9   NA
# [3,]   11   12   13   NA   NA

数据

DF <- structure(c(1, 0, 0, 2, 6, 0, 3, 7, 11, 4, 8, 12, 5, 9, 13), .Dim = c(3L, 
5L), .Dimnames = list(c("x", "y", "z"), NULL))

猜测一下逻辑:

t(apply(df_before, 1, function(x) `length<-`(x[x != 0], ncol(df_before))))

  [,1] [,2] [,3] [,4] [,5]
x    1    2    3    4    5
y    6    7    8    9   NA
z   11   12   13   NA   NA

您可以取消转置df_before data.frame 然后使用 dplyr 中的lead dplyr来移动列

library(data.table)
library(dplyr)
df_before <- data.table(
  x = c(1, 2, 3, 4, 5),
  y = c(0, 6, 7, 8, 9),
  z = c(0, 0, 11, 12, 13))

df_after <- t(data.table(
  x = c(1, 2, 3, 4, 5),
  y = c(6, 7, 8, 9, NA),
  z = c(11, 12, 13, NA, NA)))

df_before[] <-lapply(1:ncol(df_before), function(x){
  dplyr::lead(df_before[[x]],n= x-1)
})

如果您需要在此步骤之后转置数据:

df_after2 <- t(df_before)

all.equal(df_after,df_after2) # TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM