Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Scala:通过整数列表定义映射_R_Scala_Functional Programming - Fatal编程技术网

R Scala:通过整数列表定义映射

R Scala:通过整数列表定义映射,r,scala,functional-programming,R,Scala,Functional Programming,从R(完全的新手)来到Scala 假设我有两个列表: val index = List(0,0,1,0,1) val a = List(1,2,3,4,5) 然后index可以定义从a到b:List[List[Int]]的自然映射: 1 -> b(0) 2 -> b(0) 3 -> b(1) 4 -> b(0) 5 -> b(1) 以便: b = List(List(1,2,4), List(3,5)) 一般来说,给定索引和a,在Scala中创建b

从R(完全的新手)来到Scala

假设我有两个列表:

val index  = List(0,0,1,0,1)
val a      = List(1,2,3,4,5)
然后
index
可以定义从
a
b:List[List[Int]]
的自然映射:

1 -> b(0)
2 -> b(0)
3 -> b(1)
4 -> b(0)
5 -> b(1)
以便:

b = List(List(1,2,4), List(3,5))
一般来说,给定
索引
a
,在Scala中创建
b
最自然的方法是什么

e、 例如,在R中,我可以写:

run_map <- function(index, a) {
  map <- function(data, i) {
    data[[i]] <- a[which(index == i)]
    data
  }
  Reduce(map, unique(index), list())
}

run\u map如果您希望一个列表包含索引,另一个列表包含值,那么您可以
zip
将它们放在一起:

val myMap = (a zip b).toMap
其中
a
包含索引,
b
包含值

但是,如果存在重复索引,则需要执行以下操作:

for{
  (i, list) <- (a zip b) groupBy (_._1)
} yield (i, list map (_._2))
用于{
(i,列表)0)给出:

这里有一种“迭代”的方法来获得解决方案:

1) “Zip”2将列表放在一起,以生成成对列表:

index.zip(a)
结果:

List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))
2) 按列表中对的第一个元素分组

index.zip(a).groupBy(u.u 1)

结果:

List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))
3) 通过仅从列表中的每对中投影第二个元素来删除冗余索引
v

index.zip(a).groupBy(_._1).map{ case (i, v) => (i, v.map(_._2)) }
结果:

List[(Int, Int)] = List((0,1), (0,2), (1,3), (0,4), (1,5))
Map[Int,List[(Int, Int)]] = Map(1 -> List((1,3), (1,5)), 0 -> List((0,1), (0,2), (0,4)))
Map[Int,List[Int]] = Map(1 -> List(3, 5), 0 -> List(1, 2, 4))

b
的内容是什么?只是包含了
b
的内容。希望现在已经清楚了。