根据其他列表R提取列表的值

时间:2018-04-23 17:11:07

标签: r list select

分别包含三个lists ABC,分别包含crop yields及其latitudeslongitudesdataframe中的每个lists都有不同的列数,但三个列表具有相同的维度

我想应用一个函数,比如在max的每行中获取A

S=lapply(A, function(x) apply(x, 1, max))

问题:如何在BC及其column indexes e.g. which.max中获取相应的值,以便我可以说max作物A的收益率为latitude Ylongitude X

然后我会创建一个包含A.maxLatLon

列的数据框

欢迎合并三个列表以便于索引的其他方法。

谢谢。

A =list(structure(46952.8457255653, .Dim = c(1L, 1L)), structure(c(125267.690717471, 
    72379.4321037455, 72468.9078338802, 13200.2611700977), .Dim = c(1L, 
    4L)), structure(c(26513.0496549167, 26513.0496549167, 26513.0496549167, 
    26513.0496549167, 26513.0496549167, 19898.5698162604, 26513.0496549167, 
    26513.0496549167), .Dim = c(1L, 8L)), structure(c(19814.7410087512, 
    39570.9565633454), .Dim = 1:2), structure(c(52291.7656702341, 
    52291.7656702341), .Dim = 1:2))

B =list(structure(15.3210227272727, .Dim = c(1L, 1L)), structure(c(18.5599762470309, 
18.8800251256281, 18.6755033557047, 18.3664122137405), .Dim = c(1L, 
4L)), structure(c(17.625, 17.625, 17.625, 17.625, 17.6262295081967, 
17.5, 17.625, 17.625), .Dim = c(1L, 8L)), structure(c(18.25, 
18.4964285714286), .Dim = 1:2), structure(c(19.9533582089552, 
19.9633204633205), .Dim = 1:2))

C= list(structure(-84.1903409090909, .Dim = c(1L, 1L)), structure(c(-102.525534441805, 
-104.263190954774, -103.906711409396, -103.88358778626), .Dim = c(1L, 
4L)), structure(c(-77.6250000000001, -77.6250000000001, -77.6250000000001, 
-77.6250000000001, -77.6262295081967, -77.5, -77.625, -77.625
), .Dim = c(1L, 8L)), structure(c(-69.2391304347826, -69.6303571428571
), .Dim = 1:2), structure(c(-75.8619402985075, -75.8513513513514
), .Dim = 1:2))

5 个答案:

答案 0 :(得分:1)

您可以使用map&基于R.layout.page_fragment中出现最大值的索引,从BC获取值。来自A的{​​{3}} purrr的一部分。

tidyverse

答案 1 :(得分:1)

以下是基础R的答案:

max.indices <- sapply(A, which.max)
A.max <- sapply(A, max)
Lat <- sapply(seq_along(B), function(i) B[[i]][max.indices[i]])
Lon <- sapply(seq_along(C), function(i) C[[i]][max.indices[i]])

答案 2 :(得分:1)

这是一个基本的r选项:

S=sapply(A, function(x) apply(x, 1, which.max))
f <- function(x,y) x[y]
g <- function(x) mapply(f,x,S)
> mapply(rbind,g(A),g(B),g(C))
            [,1]         [,2]      [,3]        [,4]        [,5]
[1,] 46952.84573 125267.69072 26513.050 39570.95656 52291.76567
[2,]    15.32102     18.55998    17.625    18.49643    19.95336
[3,]   -84.19034   -102.52553   -77.625   -69.63036   -75.86194

答案 3 :(得分:1)

@ cmaher答案的变体,删除嵌套的map个数据。

library(tidyverse)

tibble(max_yield = map_dbl(A, which.max)) %>% 
  transmute(crop_yield =  map2_dbl(B, max_yield, ~.x[which.max(.y)]),
            latitude = map2_dbl(B, max_yield, ~.x[which.max(.y)]),
            longitude = map2_dbl(C, max_yield, ~ .x[which.max(.y)]))

  # A tibble: 5 x 3
  crop_yield latitude longitude
       <dbl>    <dbl>     <dbl>
1       15.3     15.3    - 84.2
2       18.6     18.6    -103  
3       17.6     17.6    - 77.6
4       18.2     18.2    - 69.2
5       20.0     20.0    - 75.9

答案 4 :(得分:0)

以下是使用ErrorException {#245 #message: "mkdir(): No such file or directory" 工具的解决方案。在这里,我们使用列表具有相同维度的事实,将它们放入tidyversetbl中,因此我们每次观察unnest时都会有一行,{{1} }和yield。我们必须首先将所有单行矩阵转换为向量,然后使用lat执行此操作。数据采用此格式后,每个原始列表元素获取一个值就是一个简单的longmap(as.vector)

group_by

map2(v0.2.0)创建于2018-04-23。