Как сдвигать значения в строках в R (dplyr или data.table)? - PullRequest
0 голосов
/ 23 октября 2019

Вот набор данных «до» и «после» смещения.

# 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 ячейку только для всех строк?

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 октября 2019

Гадание на логику:

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
1 голос
/ 23 октября 2019

Как то так? Просто начните строки, всегда сдвинутые на единицу, и сбросьте их 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))
0 голосов
/ 23 октября 2019

Вы можете отменить транспонирование df_before data.frame, а затем использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...