我想从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()
答案 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文件,现在有了列表。我认为包purrr
(https://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创建。