反算向量分数 [英] Reverse score a vector

查看:0
本文介绍了反算向量分数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有数值向量,如c(1, 2, 3, 3, 2, 1, 3)c(1, 4, 1, 4, 4, 1),我想保留单个元素的位置,但交换/反转值,以便分别得到c(3, 2, 1, 1, 2, 3, 1)c(4, 1, 4, 1, 1, 4)

为了实现这一点,我在下面编写了一个相当粗糙和难看的代码,并进行了大量的调试和修补...

blah <- c(1, 4, 1, 4, 4, 1, 3)
blah.uniq <- sort(unique(blah))
blah.uniq.len <- length(blah.uniq)
j <- 1
end <- ceiling(blah.uniq.len / 2)
if(end == 1) {end <- 2} # special case like c(1,4,1), should get c(4,1,4) 
for(i in blah.uniq.len:end) {
  x <- blah == blah.uniq[i]
  y <- blah == blah.uniq[j]
  blah[x] <- blah.uniq[j]
  blah[y] <- blah.uniq[i]
  j = j + 1
}
blah

有没有更简单的方法?

推荐答案

祝贺您!您可能终于找到了factor的用处,我仍在寻找:-)

x <- c(1, 2, 3, 3, 2, 1, 3)
# [1] 1 2 3 3 2 1 3
y <- factor(x)
# [1] 1 2 3 3 2 1 3
# Levels: 1 2 3
levels(y) <- rev(levels(y))
# [1] 3 2 1 1 2 3 1
# Levels: 3 2 1

基于这个想法,下面是一个函数,它返回一个与输入具有相同类的对象:

swap <- function(x) {
    f <- factor(x)
    y <- rev(levels(f))[f]
    class(y) <- class(x)
    return(y)
}
swap(c(1, 2, 3, 3, 2, 1, 3))
# [1] 3 2 1 1 2 3 1
swap(c(1, 4, 1, 4, 4, 1))
# [1] 4 1 4 1 1 4

这篇关于反算向量分数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆