如何解决通过考虑r中的分组顺序来操纵字符向量4
我试图基于Group变量item.map编写代码,该变量具有包含q矩阵的项目信息,该q矩阵显示了哪个项目与哪个组相关联。
group <- c(1,2)
ids <- c("54_a","54_b","44_a","44_c")
item.map <- data.frame(
item.id = c("54_a","44_c"),group.1 = c(1,1,0),group.2 = c(0,1))
factor <- c(54,44)
在此item.map中,group.1有3个项目,而group.2有2个项目。我想使用此item.map在下面的代码块中分配这些项目,但无法插入item.map信息。
library(stringr)
# define df for all ids and group combinations
group_g <- paste("G",1:length(group),sep ="")
df <- data.frame(ids,group = rep(group_g,each = length(ids)))
# empty vector
vec <- NULL
for(i in 1:nrow(df)) {
res <- which(str_extract(df[i,"ids"],"[0-9]{2,}") == factor)
text <- paste("(",df[i,"group"],",fixed[",c(0:length(factor)),"]) = ",ifelse(res == 0:length(factor) | 0 == 0:length(factor),"1.0","0.0"),";",sep = "")
vec <- c(vec,text)
}
> vec
"(G1,54_a,fixed[0]) = 1.0;" "(G1,fixed[1]) = 1.0;" "(G1,fixed[2]) = 0.0;"
"(G1,54_b,44_a,fixed[1]) = 0.0;" "(G1,fixed[2]) = 1.0;"
"(G1,44_c,fixed[2]) = 1.0;"
"(G2,fixed[0]) = 1.0;" "(G2,fixed[1]) = 1.0;" "(G2,fixed[2]) = 0.0;"
"(G2,fixed[2]) = 0.0;"
"(G2,fixed[1]) = 0.0;" "(G2,fixed[2]) = 1.0;"
因此,基于所需输出中的item.map
,G1不应具有项44_c,G2不应具有项54_a和44_a
所需的输出是:
> vec
"(G1,fixed[2]) = 1.0;"
解决方法
这是个主意。我将您的item.map
数据集重整为长格式。因此,item.map
与旧数据集df
具有相同的结构,但是附加列used
带有必需的0和1。
下一步,我在循环中添加了一个if
函数,因此vec
中将只包含1行。
library(stringr)
# original dataset item.map
group <- c(1,2)
ids <- c("54_a","54_b","44_a","44_c")
item.map <- data.frame(
item.id = c("54_a","44_c"),group.1 = c(1,1,0),group.2 = c(0,1))
factor <- c(54,44)
# reshape item.map
item.map2 <- item.map %>%
pivot_longer(-item.id,names_to = "group",values_to = "used") %>%
arrange(group) %>%
mutate(group = str_replace(group,"group.","G"),item.id = as.character(item.id))
# empty vector
vec <- NULL
for(i in 1:nrow(item.map2)) {
if(item.map2[i,"used"] == 1) {
res <- which(str_extract(item.map2[i,"item.id"],"[0-9]{2,}") == factor)
text <- paste("(",item.map2[i,"group"],",fixed[",c(0:length(factor)),"]) = ",ifelse(res == 0:length(factor) | 0 == 0:length(factor),"1.0","0.0"),";",sep = "")
vec <- c(vec,text)
}
}
vec
输出
[1] "(G1,54_a,fixed[0]) = 1.0;" "(G1,fixed[1]) = 1.0;" "(G1,fixed[2]) = 0.0;"
[4] "(G1,54_b,fixed[2]) = 0.0;"
[7] "(G1,44_a,fixed[1]) = 0.0;" "(G1,fixed[2]) = 1.0;"
[10] "(G2,fixed[0]) = 1.0;" "(G2,fixed[1]) = 1.0;" "(G2,fixed[2]) = 0.0;"
[13] "(G2,44_c,fixed[1]) = 0.0;" "(G2,fixed[2]) = 1.0;"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。