r - 移动一列非数字变量
问题描述
如果我有一个变量数据框,我如何将一列(例如第 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
解决方案
问题在于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
推荐阅读
- php - 循环过去的日期并在 php 中删除
- java - 将 kotlin 的单元转换为 Java 的字符串
- lodash - 根据列名数组获取值
- python - 集成函数以返回数组
- .net - 在一段时间不活动后将 Grain 状态保存到外部服务
- java - 在Java中使用过滤器时如何替换表达式?
- c# - 如何在备用shell rdp中将参数传递给exe
- python - 使用 gspread 在 colab 笔记本中打开公共电子表格而不进行身份验证
- spring-boot - ExtJS7 事件是否能够检测服务器端事件(WebFlux)?
- wxpython - 在 ListCtrl 更新时生成 EVT_LIST_ITEM_FOCUSED