首页 > 解决方案 > R:基于 2 个范围指标从二维网格映射和检索值

问题描述

所以,我有一个示例数据框和一个示例网格,我想做的是根据数据框的值从网格中映射和检索相应的数据。请参阅下面的示例。免责声明:数据和网格是示例,使用的名称/指标名称完全用于模仿目的。

示例网格:为了澄清,

L为左开右闭括号,即L000_050表示(0, 50],L080_HI表示(80, +]。

D是左闭右开括号,即D178_190表示[178, 190),D190_HI表示[190, +)。

df_grid <- data.frame(
  "Tall/Look" = c("D000_178", "D178_190","D190_HI"),
  "L000_050" = c(66.82, 78.17, 80.47),
  "L050_080" = c(78.37, 80.47, 85.47),
  "L080_HI" = c(85.65, 91.85, 90.54)
)
> print(df_grid)
  Tall.Look L000_050 L050_080 L080_HI
1  D000_178    66.82    78.37   85.65
2  D178_190    78.17    80.47   91.85
3   D190_HI    80.47    85.47   90.54

数据:

df_name <- data.frame(
  "Name" = c("Liam", "Noah", "William", "James", "Oliver", "Lucas", "Benjamin"),
  "Tall" = c(1.75, 1.80, 1.82,1.69,1.92,1.9,1.85),
  "Look" = c(81.33, 75.78, 60.13, 70.52, 50.91, 85.21, 48.07)
)

print(df_name)
> print(df_name)
      Name Tall  Look
1     Liam 1.75 81.33
2     Noah 1.80 75.78
3  William 1.82 60.13
4    James 1.69 70.52
5   Oliver 1.92 50.91
6    Lucas 1.90 85.21
7 Benjamin 1.85 48.07

所需输出:基本上我想将 df_name 中的“Tall”和“Look”指标映射到 df_grid 并检索网格值并将它们存储在“Point”列中,结果如下:

> print(df_mapped)
      Name Tall  Look Point
1     Liam 1.75 81.33 85.65
2     Noah 1.80 75.78 80.74
3  William 1.82 60.13 80.74
4    James 1.69 70.52 75.37
5   Oliver 1.92 50.91 80.47
6    Lucas 1.90 85.21 90.54
7 Benjamin 1.85 48.07 78.17

到目前为止,我一直在网上搜索这个,我找到了 find_interval、match 和其他一些材料,但它们似乎不是为二维映射设计的。如果可以,请提供您的帮助,在此先感谢。

标签: r

解决方案


使 df_grid 成为矩阵更有意义。然后使用 cut 将标签分配给 df_name 中的值,标签指定为查找矩阵的行名或列名。之后就是插入值的问题..

# make you df_grid a matrix instead
mat_grid <- rbind(
   c(66.82, 78.17, 80.47),
   c(78.37, 80.47, 85.47),
   c(85.65, 91.85, 90.54)
   )
colnames(mat_grid)=c("D000_178", "D178_190","D190_HI")
rownames(mat_grid)=c("L000_050", "L050_080","L080_HI")

# we assign the labels to Look values
l1 <- cut(df_name$Look,
breaks=c(0,50,80,+Inf),labels=rownames(mat_grid),right=FALSE)
# we assign the labels to Tall values
l2 <- cut(df_name$Tall,
breaks=c(0,1.78,1.90,+Inf),labels=colnames(mat_grid),right=FALSE)
# we call out each mapped values
# might be a faster way to do this without sapply-ing..
# from http://eamoncaddigan.net/r/programming/2015/10/22/indexing-matrices/
df_name$Point = mat_grid[cbind(as.character(l1),as.character(l2))]

推荐阅读