在数据框中找到最接近的匹配值并返回索引

时间:2019-08-06 19:05:24

标签: r match

我有两个数据帧。第一个是一组变量,其中最后一列是每一行中每个值的总和。第二个数据帧是一个索引,其中第一列是rowSum值可能属于的一组可能值。

我想要做的是将第一个数据帧中的rowSum值与第二个数据帧中与之最接近的值进行匹配,然后返回第二个数据帧中与该值一起出现的值,就像分配一个根据考试成绩的字母等级。

a <- c(1.2, 2.3, 3.4)
b <- c(2.3, 3.4, 4.5)
c <- c(3.4, 4.5, 5.6)
score <- c(6.9, 10.2, 13.5)

Scores <- data.frame(cbind(a,b,c,score))

score <- c(15, 14, 13
       ,12, 11, 10
       ,9, 8, 7
       ,6, 5, 4
       ,3, 2, 1)

grade <-  c('A','A','A'
        ,'B','B','B'
        ,'C','C','C'
        ,'D','D','D'
        ,'F', 'F', 'F')

Grades <- data.frame(cbind(score,grade))


Scores$Grade <-
  Grades$grade[match(Scores$score, Grades$score)]

预期:

a    b    c    score    Grade
1.2  2.3  3.4  6.9      C
2.3  3.4  4.5  10.2     B
3.4  4.5  5.6  13.5     A

实际:

a    b    c    score    Grade
1.2  2.3  3.4  6.9      NA
2.3  3.4  4.5  10.2     NA
3.4  4.5  5.6  13.5     NA

我认为这是因为match()不能舍入小数,因此不能与精确值匹配。是否有其他函数或方法可以将值匹配到最接近的匹配整数并返回相应的Grade?

1 个答案:

答案 0 :(得分:0)

这可以通过struct Inner { char* OwO[12]; }; struct Middle { Inner iwi; }; struct Outer { Middle uwu; }; Outer owo; int main() { owo.uwu.iwi.OwO[0] = "What's this?"; printf("%s\n", owo.uwu.iwi.OwO[0]); return 0; } 完成,但是请确保正确创建了数据集,findInterval返回cbind,而matrix只能有一个类。用matrix包装会根据data.frame(如果至少有一个factor元素)将相同的类传播到characterstringsAsFactors = TRUE/FALSE

通过“得分”列对“成绩”数据集进行排序,并应用character以获取最接近匹配值的索引,并将其用于提取“成绩”

findInterval

或另一种选择是滚动联接

Scores <- data.frame(a,b,c,score)
Grades <- data.frame(score,grade)
Grades1 <- Grades[order(Grades$score),]
Scores$Grade <- Grades1$grade[findInterval(Scores$score, Grades1$score) +1]