我有一个包含 10 个逻辑结果的列表,TRUE 或 FALSE。而另一个列表里面有数字,两个列表的长度是不同的,但第一个列表的长度是固定的。
> i=1
> v <- c(201640,201710,201720,201730,201740,201810,201820,201830,201840,201910)
> dat <- c(201710,201720,201740,201810,201820,201840,201910)
> dat1 <- c(0.000000,4.000000,4.000000,3.875000,3.900000,3.916667,3.875000)
> H <- v %in% dat
> H
[1] FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
> result[i] <- H
> result1[i] <- ifelse(H=="TRUE", dat1, NA)
> result1[i]
X1
1 NA
2 4.000000
3 4.000000
4 NA
5 3.900000
6 3.916667
7 3.875000
8 NA
9 4.000000
10 4.000000
因此,向量 v fixed 和 dat 和 dat1 具有相同的长度,并且可能会根据您从大数据中选择的主题而变化。因此,NA 表示该年的数据不可用。例如,您可以看到 v 以 201640 开头,但 dat 没有该值,因此它已被替换为 NA,NA 与 FALSE 相关联。然后下一个是 201710,它可以在 dat 中找到,所以它给出 TRUE 并选择 dat1 中的第一个数字,依此类推。
> i=1
> v <- c(201640,201710,201720,201730,201740,201810,201820,201830,201840,201910)
> dat <- c(201710,201720,201740,201810,201820,201840,201910)
> dat1 <- c(0.000000,4.000000,4.000000,3.875000,3.900000,3.916667,3.875000)
> H <- v %in% dat
> H
[1] FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
> result[i] <- H
> result1[i] <- ifelse(H=="TRUE", dat1, NA)
> result1[i]
X1
1 NA
2 0.000000
3 4.000000
4 NA
5 4.000000
6 3.875000
7 3.900000
8 NA
9 3.916667
10 3.875000
听起来你基本上在寻找左连接; 这听起来对吗? 使用数据框而不是矢量使这变得简单明了:
library(dplyr)
result = data.frame(year = v) %>%
left_join(data.frame(year = dat, value = dat1),
by = c("year"))
(result$value
与所需的向量result1
相同。
我认为@A.S.K建议的left_join
(也看看基础R的merge
(是构建数据的最佳方式。无论如何,如果你想坚持使用向量,这里有一个选项使用基数 R 的 match
-
dat1[match(v, dat)]
[1] NA 0.000000 4.000000 NA 4.000000 3.875000 3.900000 NA 3.916667 3.875000
数据-
v <- c(201640,201710,201720,201730,201740,201810,201820,201830,201840,201910)
dat <- c(201710,201720,201740,201810,201820,201840,201910)
dat1 <- c(0.000000,4.000000,4.000000,3.875000,3.900000,3.916667,3.875000)