【发布时间】:2018-01-15 13:35:37
【问题描述】:
我有一个列表aa,它引用了另一个列表bb 的索引名称并包含另一个元素(称为cm)。列出 bb 项目包含字符串。我有一个循环通过bb,并且对于与我指定的字符串匹配的每个项目,将其添加到数据框中的新行中。我还需要将cm 值添加到该行。
例子:
library("tidyverse")
aa <- list(c(123, 1), c(234, 1), c(345, 2), c(456, 3))
bb <- list("123" = c("a", "b", "c"), "234" = c("b", "c", "d"), "345" = c("c", "d", "e"), "456" = c("f", "g", "h"))
cc <- c("a", "b", "c")
tbl <- NULL
for (a in aa){
for (b in bb) {
if (any(cc %in% b)) {
tb <- tibble(cm=a[2],n1=b[1],n2=b[2],n3=b[3])
tbl <- bind_rows(tbl,tb)
}
}
}
这会遍历bb 的每个可能组合,并将其添加到每个cm 的配对中,这并不好。我的输出应该是这样的:
output <- tibble(cm = c(1, 1, 2), n1 = c("a", "b", "c"),
n2 = c("b", "c", "d"), n3 = c("c", "d", "e"))
> output
# A tibble: 3 x 4
cm n1 n2 n3
<dbl> <chr> <chr> <chr>
1 1 a b c
2 1 b c d
3 2 c d e
我认为这样的事情可能会起作用,因为至少我可以稍后循环通过 tbl 并使用 nm 将其替换为适当的 cm 值:
tbl <- NULL
for (a in aa){
for (b in bb) {
if (any(cc %in% b)) {
tb <- tibble(nm = names(bb)[b], n1=b[1],n2=b[2],n3=b[3])
tbl <- bind_rows(tbl,tb)
}
}
}
我真的不明白为什么这不起作用,因为names(bb)[1] 返回123,所以我认为它与names(bb)[b] 在循环中会起作用。
【问题讨论】:
-
你的 for 循环
for (b in bb)循环遍历bb的每个元素,但是如果你想索引向量names(bb)你需要将循环写成for (b in 1:length(bb))然后使用整数b索引列表bb和向量names(bb)。