【问题标题】:recode variable to multiple new values重新介绍变量到多个新值
【发布时间】:2013-07-13 20:10:33
【问题描述】:

我有一个数据集,其中包含一组人的观察分数,如下所示:

person_id <- c(1:50)
person_score <- rep(1:10,5)
people <- data.frame(person_id, person_score)

我需要创建一组新变量,这些变量是观察分数的重新编码值。我有一组变量,它们是将观察到的分数转换为新变量的“关键”,如下所示:

observed <- c(1,2,3,4,5,6,7,8,9,10)
score1 <- c(10,14,17,18,20,21,22,26,28,31)
score2 <- c(6,9,11,14,17,18,20,24,25,26)
score3 <- c(11,13,15,17,19,21,23,25,27,29)
score4 <- c(43,44,45,46,47,48,49,50,51,52)
scores <- data.frame(observed,score1,score2, score3, score4)

...其中第一个值对应于观察到的分数 = 1,第二个值对应于观察到的分数 = 2,依此类推。

我需要创建四个新变量,分别对应 score1、score2、score3 和 score 4。 我可以考虑手动重新编码,如下图,但是很慢很繁琐:

people$value1[person_score == 1] <- 10
people$value1[person_score == 2] <- 14

...对于 score1 以此类推

people$value2[person_score == 1] <- 6
people$value2[person_score == 2] <- 9

...score2 以此类推

people$value3[person_score == 1] <- 11
people$value3[person_score == 2] <- 13

...score3 以此类推

people$value4[person_score == 1] <- 43
people$value4[person_score == 2] <- 44

...score4 以此类推

【问题讨论】:

    标签: r


    【解决方案1】:

    我只会使用 match 从分数中找到正确的行 data.frame...

    idx <- match( people$person_score , scores$observed )
    
    people_new <- cbind( people , scores[ idx , -1 ] )
    
    head(people_new)
    #  person_id person_score score1 score2 score3 score4
    #1         1            1     10      6     11     43
    #2         2            2     14      9     13     44
    #3         3            3     17     11     15     45
    #4         4            4     18     14     17     46
    #5         5            5     20     17     19     47
    #6         6            6     21     18     21     48
    

    【讨论】:

    • 这似乎有效,除了我只得到前两个新变量(score1 和 score2)。
    • @windy 您需要先将cbind 的所有个人分数放入scores data.frame(您在match 中使用),例如`scores
    【解决方案2】:

    这只是两个data.frames的连接:你可以使用merge

    merge( people, scores, by.x = "person_score", by.y = "observed", all.x = TRUE )
    

    sqldf

    library(sqldf)
    sqldf( "
      SELECT    *
      FROM      people
      LEFT JOIN scores
      ON        people.person_score = scores.observed
    " )
    

    【讨论】:

      【解决方案3】:

      你可以使用qdap package'slookup函数如下:

      ## person_id <- c(1:50)
      ## person_score <- rep(1:10,5)
      ## people <- data.frame(person_id, person_score)
      ## 
      ## observed <- c(1,2,3,4,5,6,7,8,9,10)
      ## score1 <- c(10,14,17,18,20,21,22,26,28,31)
      ## score2 <- c(6,9,11,14,17,18,20,24,25,26)
      ## score3 <- c(11,13,15,17,19,21,23,25,27,29)
      ## score4 <- c(43,44,45,46,47,48,49,50,51,52)
      ## scores <- data.frame(observed,score1,score2, score3, score4)
      
      library(qdap)
      people[, 3:6] <- lapply(scores[, -1], function(x) lookup(people$person_score, scores[, 1], x))
      
      people
      ##    person_id person_score score1 score2 score3 score4
      ## 1          1            1     10      6     11     43
      ## 2          2            2     14      9     13     44
      ## 3          3            3     17     11     15     45
      ## 4          4            4     18     14     17     46
      ## 5          5            5     20     17     19     47
      ## 6          6            6     21     18     21     48
      ## 7          7            7     22     20     23     49
      .
      .
      .
      ## 50        50           10     31     26     29     52
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        相关资源
        最近更新 更多