Сдвиг столбца нечисловых переменных - PullRequest
0 голосов
/ 19 сентября 2018

Если у меня есть блок данных переменных, как мне сдвинуть записи в одном столбце (например, в столбце 4) на единицу и заменить пустые ячейки на «NA»?

Для числовых данных:

mydata <- data.frame(replicate(5,sample(1:20,10,rep=TRUE)))

> mydata
   X1 X2 X3 X4 X5
1  12  2  4  7 10
2  15  2 15  3  8
3  11 12 18 10  3
4  18  8  4 17 12
5  16 17  2  8 10
6   6  3 14 15 18
7  14  3 14 14 13
8  16 15 15  9 14
9  14 12 15 20  3
10 10 16  8 18  5

Я могу добиться этого с помощью функции 'shift':

shift <- function(x, n){
 c(x[-(seq(n))], rep(NA, n))
 }

mydata[,4] <- shift(mydata[,4], 1)

> mydata
   X1 X2 X3 X4 X5
1  12  2  4  3 10
2  15  2 15 10  8
3  11 12 18 17  3
4  18  8  4  8 12
5  16 17  2 15 10
6   6  3 14 14 18
7  14  3 14  9 13
8  16 15 15 20 14
9  14 12 15 18  3
10 10 16  8 NA  5

Если мои данные числовые, это работает.Но если мои данные не являются числовыми, это меняет мой столбец на числовое представление.

mydata<- data.frame(replicate(5,sample(c("apple", "banana", "peach", "grape"),10,rep=TRUE)))

> mydata
   X1     X2     X3     X4    X5
1  banana banana banana  grape apple
2   apple  peach  grape  grape apple
3   grape  grape banana  peach peach
4   apple  apple  peach banana peach
5   grape banana  grape  apple peach
6   grape  grape  grape banana apple
7   grape  grape  peach  apple peach
8  banana  grape banana  apple grape
9   peach  apple  peach  peach grape
10  apple  peach banana  grape grape


shift <- function(x, n){
 c(x[-(seq(n))], rep(NA, n))
 }
mydata[,4] <- shift(mydata[,4], 1)

> mydata
   X1     X2     X3 X4    X5
1  banana banana banana  3 apple
2   apple  peach  grape  4 apple
3   grape  grape banana  2 peach
4   apple  apple  peach  1 peach
5   grape banana  grape  2 peach
6   grape  grape  grape  1 apple
7   grape  grape  peach  1 peach
8  banana  grape banana  4 grape
9   peach  apple  peach  3 grape
10  apple  peach banana NA grape

Любые идеи, как сохранить слова "яблоко / банан / персик / виноград" после сдвига?Или, возможно, другой подход лучше?Спасибо!

Желаемый результат:

> mydata
   X1     X2     X3     X4    X5
1  banana banana banana  grape apple
2   apple  peach  grape  peach apple
3   grape  grape banana banana peach
4   apple  apple  peach  apple peach
5   grape banana  grape banana peach
6   grape  grape  grape  apple apple
7   grape  grape  peach  apple peach
8  banana  grape banana  peach grape
9   peach  apple  peach  grape grape
10  apple  peach banana     NA grape

1 Ответ

0 голосов
/ 19 сентября 2018

Проблема в том, что data.frame обрабатывает строки как факторы.

set.seed(0)
fruit <- c("apple", "banana", "peach", "grape")
mydata <- data.frame(replicate(5,sample(fruit, 10, rep=T)))

> mydata
       X1     X2     X3     X4     X5
1   grape  apple  grape banana banana
2  banana  apple  grape banana  grape
3  banana  apple  apple  peach  peach
4   peach  peach  peach banana  grape
5   grape banana  apple  apple  peach
6   apple  grape banana  grape  peach
7   grape banana banana  peach  grape
8   grape  peach  apple  grape  apple
9   peach  grape banana  apple banana
10  peach banana  grape  peach  peach

> class(mydata[, 'X4'])
[1] "factor"

Чтобы исправить это, вы можете использовать пакет data.table, который по умолчанию не обрабатывает строки как факторы.Он также поставляется с функцией shift, которая делает то, что вы хотите.Чтобы сдвинуть значения «вверх» на единицу, установите аргумент type='lead':

library(data.table)
setDT(mydata)
mydata[, X4 := shift(X4, 1, type='lead')]

> mydata
        X1     X2     X3     X4     X5
 1:  grape  apple  grape banana banana
 2: banana  apple  grape  peach  grape
 3: banana  apple  apple banana  peach
 4:  peach  peach  peach  apple  grape
 5:  grape banana  apple  grape  peach
 6:  apple  grape banana  peach  peach
 7:  grape banana banana  grape  grape
 8:  grape  peach  apple  apple  apple
 9:  peach  grape banana  peach banana
10:  peach banana  grape   <NA>  peach
...