如何在R中使用FOR循环访问多维列表元素

时间:2018-08-28 12:23:18

标签: r list for-loop

我想从R中的多维列表访问变量'bandSpecificMatadata',并为我的遥感项目创建一个'reflectanceCoefficient'向量。

首先,我能够减小列表的尺寸,然后使用sudo npm install -g puppeteer --unsafe-perm=true --allow-root 来精确定位列表。

然后,当我尝试使用FOR循环创建类似(bandNumber1对应于反射系数2.21e-5)时,就会出现问题。

nodes <- get('EarthObservationResult', matadata.list$resultOf)

打印出:

for(node in nodes[6:9]) {
    bn = get("bandNumber", node)
    if(bn %in% c('1','2','3','4')){
             i = integer(bn)
             coeffs = get("reflectanceCoefficient", node)
             }
       print(coeffs)
    }

但是我想要一个带有1、2、3、4以及相应数字的向量。在我看来,数字在每次打印时都会覆盖最后一个。

然后我尝试了:

[1] "2.21386105481e-05"
[1] "2.31474175457e-05"
[1] "2.60208594123e-05"
[1] "3.83481925626e-05"

但是事实

for(node in nodes[6:9]) {
  n = 1:4
  b[n] = get("bandNumber", node)
  if(b[n] %in% c('1','2','3','4')){
    i = integer(b[n])
    coeffs[i] = get("reflectanceCoefficient", node)
    }

  print(coeffs)
  }

该如何解决?

我使用Error in integer(b[n]) : invalid 'length' argument In addition: Warning message: In if (b[n] %in% c("1", "2", "3", "4")) { : the condition has length > 1 and only the first element will be used 解析xml,并使用XML::xmlParse()将数据转换为列表。

有关可重现的示例,请参见下文:

matadata.list <- XML::xmlToList()

2 个答案:

答案 0 :(得分:1)

由于您未提供任何可复制的数据,因此以下尝试可能不起作用:

# Initialise vectors:
b <- vector(mode = "character", length = 4)
coeffs <- vector(mode = "character", length = 4)

# Get coefficients
for(i in 6:9) {
     b[i] = get("bandNumber", nodes[[i]])
     coeffs[i] <- ifelse(b[i] %in% 6:9), 
                         get("reflectanceCoefficient", nodes[[i]]),  # Yes cond val
                         NA)                                         # No cond val
     }
coeffs

答案 1 :(得分:1)

(编辑以回答更新的问题)
查看以下答案以使用原始xml数据:How to parse XML to R data frame

您已经解析了xml文件,现在有了列表。我认为包purrrhttps://purrr.tidyverse.org/)在这种情况下很有帮助。

我假设我们知道到EarthObservationResult的路径。请注意,我们如何从所有子节点提取reflectanceCoefficient并使用compact丢弃NULL元素。

library(tidyverse)

nodes <- matadata.list$resultOf$EarthObservationResult

coefff <- nodes %>%
    purrr::map("reflectanceCoefficient") %>%
    purrr::compact() %>%
    purrr::map_dbl(~ as.numeric(.x)) %>%
    purrr::set_names(nm = NULL)

print(coeffs)
#> [1] 2.213861e-05 2.314742e-05 2.602086e-05 3.834819e-05

reprex package(v0.2.0)于2018-08-28创建。