提问人:Av65 提问时间:11/9/2023 最后编辑:Av65 更新时间:11/9/2023 访问量:39
测试变量是否包含存储在向量中的值
Test if a variable contains a value stored in a vector
问:
我有以下数据帧和向量
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
答:
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 将在我分析的后续步骤中对我有很大帮助。
评论