问题描述
我尝试在保留订单的同时从当前数据帧移动,但它无法按我的意愿工作。尝试使用 grep 工作捕获 rest1、rest2,但是当我尝试对它们重新排序时,它给出了包含所有字符的向量:(
原始 DF 看起来像:
ID | rank1 | rank2 | rank3 | rank4 | ... |
---|---|---|---|---|---|
1 | 苹果 | 休息1 | 橙色 | 葡萄 | ... |
2 | rest2 | 橙色 | 休息1 | 苹果 | ... |
所以预期的表应该看起来像,对于每一行,“rest1”|“rest2”应该移到最后,df应该看起来像:
ID | rank1 | rank2 | rank3 | rank4 | ... |
---|---|---|---|---|---|
1 | 苹果 | 橙色 | 葡萄 | ... | 休息1 |
2 | 橙色 | 苹果 | ... | 休息1 | rest2 |
我用 NA 值替换了所有的 rest1 和 rest2,然后移到最后一列。但以下代码不起作用。
df % relocate(where(is.na),.after = last_col())
解决方法
这是一种方法,
setNames(as.data.frame(
t(apply(as.matrix(dat),1,function(row) c(grep("^rest",row,value = TRUE,invert = TRUE),grep("^rest",value = TRUE))))),names(dat))
# ID rank1 rank2 rank3 rank4 rank9
# 1 1 apple orange grape <NA> rest1
# 2 2 orange apple <NA> rest2 rest1
另一种更简单的方法:
setNames(as.data.frame(
t(apply(as.matrix(dat),function(row) row[order(grepl("^rest",row))]))),names(dat))
这应该保留组内的自然顺序(例如,第一组是那些不包含 "^rest"
的组)。
如果您需要以不同于每行显示的顺序添加 sort(.)
,您可以添加它们。
注意:我从列名 rank#
推断列本身具有相关性,在这种情况下,此操作会错误排序您的数据。如果您必须这样做,因为它曾经在某一点订购正确,现在在框架中格式不正确,我建议您考虑修复导入过程,而不是事后修复它。
数据
dat <- structure(list(ID = 1:2,rank1 = c("apple","rest2"),rank2 = c("rest1","orange"),rank3 = c("orange","rest1"),rank4 = c("grape","apple"),rank9 = c(NA,NA)),class = "data.frame",row.names = c("1","2"))