是否有一个 R 函数可以匹配,如果 False 然后用 NA 替换它,如果为 true,则转到列表并选择第一个数字,依此



我有一个包含 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)

最新更新