R 移动特定值,同时保持字符数据框中的顺序

问题描述

我尝试在保留订单的同时从当前数据帧移动,但它无法按我的意愿工作。尝试使用 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"))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...