首页 > 解决方案 > 移动一列非数字变量

问题描述

如果我有一个变量数据框,我如何将一列(例如第 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 <- 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

标签: rdataframeshift

解决方案


问题在于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了您想要的功能。要将值“向上”移动 1,请设置参数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

推荐阅读