首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动一列非数值变量

移动一列非数值变量
EN

Stack Overflow用户
提问于 2018-09-19 08:17:56
回答 1查看 95关注 0票数 0

如果我有一个变量的数据,如何将一列(例如,第4列)中的条目向上移动,并将空单元格替换为"NA"?

对于数字数据:

代码语言:javascript
复制
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”功能来实现这一点:

代码语言:javascript
复制
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

如果我的数据是数字的,这是可行的。但是,如果我的数据是非数字的,它会将我的列更改为数字表示.

代码语言:javascript
复制
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

有什么想法,如何保留“苹果/香蕉/桃子/葡萄”字后的转移?或者另一种方法更好?谢谢!

预期结果:

代码语言:javascript
复制
> 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 09:00:34

问题在于,data.frame将字符串视为因素。

代码语言:javascript
复制
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'

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52401261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档