R语言 测试变量是否包含存储在向量中的值

qoefvg9y  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(70)

我有下面的矩阵和向量

data=data.frame(var1=c("jup", "far", "part", "part;melt", "rat", "rat;art", "kir;door;art"), var2=c("0","8","5","7;8","3","9;4","6;5;9"))

vec1=c("bato", "kir", "door", "part", "zat", "melt", "art")

> data
          var1  var2
1          jup     0
2          far     8
3         part     5
4    part;melt   7;8
5          rat     3
6      rat;art   9;4
7 kir;door;art 6;5;9

字符串
我想创建第三和第四个变量,其中包含var 1和var 2的值,如果var 1包含存储在vec 1中的值。我只能在var 1中只有一个值时这样做,但不知道如何管理包含两个或更多值的情况。
例如,对于“部分; melt”我想得到“part;melt”和“7;8”,对于“rat;art”我想得到“art”和“4”,对于“kir;door;art”我想得到“kir;door;art”和“6;5;9”
我会感激任何帮助

data_output = data %>%
  mutate(var1b=ifelse(var1 %in% vec1, var1, NA)) %>%
 mutate(var2b=ifelse(var1 %in% vec1, var2, NA)) %>%
> data_output
          var1  var2       var1b var2b
1          jup     0        <NA>  <NA>
2          far     8        <NA>  <NA>
3         part     5        part     5
4    part;melt   7;8   part;melt   7;8
5          rat     3        <NA>  <NA>
6      rat;art   9;4         art     4
7 kir;door;art 6;5;9 kir;dor;art 6;5;9
zz2j4svz

zz2j4svz1#

您可以将分号分隔的数据拆分为更长的格式,并使用ifelse获取相应的值。

library(dplyr)
library(tidyr)

data %>%
  mutate(row = row_number()) %>%
  separate_longer_delim(c(var1, var2), ";") %>%
  mutate(var1b = ifelse(var1 %in% vec1, var1, NA), 
         var2b = ifelse(var1 %in% vec1, var2, NA)) %>%
  summarise(across(starts_with("var"), 
            ~paste0(na.omit(.x), collapse = ";")), .by = row) %>%
  mutate(across(c(var1b, var2b), ~na_if(., ""))) %>%
  select(-row)

#          var1  var2        var1b var2b
#1          jup     0         <NA>  <NA>
#2          far     8         <NA>  <NA>
#3         part     5         part     5
#4    part;melt   7;8    part;melt   7;8
#5          rat     3         <NA>  <NA>
#6      rat;art   9;4          art     4
#7 kir;door;art 6;5;9 kir;door;art 6;5;9

字符串

ql3eal8s

ql3eal8s2#

你可以做

data %>% 
  mutate(var3 = sapply(lapply(strsplit(var1, ';'), \(x) match(x, vec1)), \(x) {
                  paste(na.omit(vec1[unlist(x)]), collapse = ';')}),
         var4 = unlist(Map(\(x, y) {
           paste(na.omit(x[y %in% vec1]), collapse = ';')}, 
           strsplit(var2, ';'), strsplit(var1, ';'))))
#>           var1  var2         var3  var4
#> 1          jup     0                   
#> 2          far     8                   
#> 3         part     5         part     5
#> 4    part;melt   7;8    part;melt   7;8
#> 5          rat     3                   
#> 6      rat;art   9;4          art     4
#> 7 kir;door;art 6;5;9 kir;door;art 6;5;9

字符串

相关问题