根据其他列

时间:2017-04-10 21:20:33

标签: r dataframe conditional match

我有一个如下所示的数据框:

  ID     Score New.ID New.Score
  123     5      456          
  456     1      789          
  789     0      123   

我想给New.ID列提供相同的分数(它们的顺序不同)。

期望的结果:

  ID    Score New.ID New.Score
  123     5      456         1
  456     1      789         0
  789     0      123         5

重建数据框的代码:

ID <- as.factor(c(123,456,789))
Score <- c(5,1,0)
New.ID<- as.factor(c(456, 789, 123))
New.Score <- c(1,0,5)
dt <- data.frame(ID, Score, New.ID, New.Score)

更新

期望的输出:

  Group  ID Score New.ID New.Score
     1 123     5    456         1
     1 456     1    789         0
     1 789     0    123         5
     2 555     1    999         0
     2 123     1    123         1
     2 999     0    555         1

所以我试图尝试为每个组使用该功能。 ID 123在第1组中得分为5,但在第2组中得分为1。我只想使用每组中出现的分数。

我尝试了ave

mtch <- function(x) {
  dt[match(x,dt$ID),"Score"]  
}

dt$New.Score <- ave(dt$New.ID, dt$Group, FUN = mtch)

但它给了我NA值。

第二个df的代码:

Group <- as.factor(c(1, 1, 1, 2, 2, 2))
ID <- as.factor(c(123,456,789, 555, 123, 999))
Score <- c(5,1,0, 1,1,0)
dt <- data.frame(Group, ID, Score, New.ID)

1 个答案:

答案 0 :(得分:4)

一个简单的match应该可以解决问题。使用您提供的数据:

data <- data.frame(ID, Score, New.ID)
data$New.Score <- data[match(data$New.ID,data$ID),"Score"]

然后检查这是我们想要的结果:

identical(dt,data)
#[1] TRUE