如何解决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"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。