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

Test if a variable contains a value stored in a vector

提问人:Av65 提问时间:11/9/2023 最后编辑:Av65 更新时间:11/9/2023 访问量:39

问:

我有以下数据帧和向量


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


如果 var1 包含存储在 vec1 中的值,我想创建包含 var1 和 var2 值的第三个和第四个变量。只有当 var1 中只有一个值时,我才能这样做,但不知道如何处理包含两个或更多值的情况。

例如,对于“part;融化“我想得到”部分;融化“和”7;8“,代表”大鼠;art“我想得到”art“和”4“,代表”kir;门;艺术“我想得到”kir;门;艺术“和”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
R 字符串 DataFrame 测试

评论


答:

0赞 Allan Cameron 11/9/2023 #1

你可以做

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
0赞 Ronak Shah 11/9/2023 #2

您可以将分号分隔的数据拆分为较长的格式,并用于获取相应的值。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 

评论

0赞 Av65 11/9/2023
非常感谢。我的真实数据有点复杂,但它有效,并且仅使用 mutate row、separate_longer_delim 和 mutate var1b 和 var2b 将在我分析的后续步骤中对我有很大帮助。