【问题标题】:Recoding Numeric Vector R重新编码数值向量 R
【发布时间】:2011-02-01 03:15:20
【问题描述】:

我有一个数字向量,比如说:

x <- rep(1:6, 300)

我想做的是重新编码向量,使 6=1,5=2,4=3,3=4,2=5,1=6。我不想从中创造一个因素。

到目前为止,我尝试过的所有事情都因为顺序而给了我错误的计数,即:

x[x == 6] <- 1 
x[x == 5] <- 2 ## Lines that follow where x[x == 2] removes 5's entirely from counts. 

注意:我知道 car 包,但更愿意使用 base R 来解决这个问题。

【问题讨论】:

  • 我想我可以创建一个新列并执行 abs(7-x[1]) 之类的操作

标签: r


【解决方案1】:

在新旧值之间构建一个映射,并与旧值建立子集,

(6:1)[x]

【讨论】:

  • 不仅适用于我的特定用例。
【解决方案2】:

7 - x 这样简单的东西难道不能满足你的需求吗?

【讨论】:

  • 有时,我只是把我的问题写出来让别人回答,就可以弄清楚这些事情!谢谢!
【解决方案3】:

请参阅car::recode 的手册。否则,创建变量y

y <- numeric()
length(y) <- length(x)
y[x == 6] <- 1
y[x == 5] <- 2
## ad nauseam...

在原地重新编码变量总是被认为是一种不好的做法,因为如果你把事情搞砸了,你可能会丢失数据。小心点。

【讨论】:

    【解决方案4】:

    在您的情况下,是的,只需减去即可。一般来说,match 在这种情况下非常有用。例如,假设您想将此 x 列中的值重新编码为 y 列中的值

    > d <- data.frame(x=c(1,3,4,5 ,6),y=c(3,4,2.2,1,4.6))
    > print(d, row.names=FALSE)
     x   y
     1 3.0
     3 4.0
     4 2.2
     5 1.0
     6 4.6
    

    然后这会将a 中的值重新编码为新值。

    > a <- c(3,4,6,1,5)
    > d$y[match(a,d$x)]
    [1] 4.0 2.2 4.6 3.0 1.0
    

    【讨论】:

    • match 只返回第一个匹配项,因此只有在没有重复值的情况下才有效。
    • 但是如果有重复的值,我们将如何选择它们中的哪一个来重新编码?
    • 其实这是我面临的另一个问题。现在我已经把这部分整理好了。
    【解决方案5】:

    rev(x) ...至少当长度是序列的偶数倍时。

    【讨论】:

    • &gt; all( rev(x) == (7-x) ) #[1] TRUE
    • 这只是这里生成的数据的一个工件。考虑排序不正确的数据:x &lt;- c(1,1,2,3,4,5,6,1); all(rev(x) == (7 - x))
    • @Chase:我发布它时。这只是“当长度是序列的偶数倍时”的解决方案。
    【解决方案6】:

    如果您想重新编码多个变量,您可以采用以下方法:

    MapFunc = function(x) { 
        y = NULL;
            if (x %in% c("1","2","3")) {y=100}
            if (x %in% c("0","4")) {y=200}
            if (x %in% c("5")) {y=100}
        print(y)
        }
        MapFunc(x=1); MapFunc(x=0);   #working ok for scalars
    
    #
    X = matrix( sample(0:5,25,replace=TRUE), nrow=5,ncol=5)
    apply(X,c(1,2),MapFunc) #working ok for matrices... 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      相关资源
      最近更新 更多