Манипулирование символьным вектором путем рассмотрения последовательности группировки в r (4)

#r #character

#r #символ

Вопрос:

Я пытаюсь написать код на основе групповой переменной item.map, которая содержит информацию об элементе, которая включает q-матрицу, показывающую, какой элемент связан с какой группой.

 group <- c(1,2)
ids <- c("54_a","54_b","44_a","44_c")
item.map <- data.frame(
  item.id = c("54_a","54_b","44_a","44_c"),
  group.1 = c(1,1,1,0),
  group.2 = c(0,1,0,1))

factor <- c(54,44)
  

В этом item.map group.1 было 3 элемента во время группы.2 содержит два элемента. Используя this 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"], ", ", df[i, "ids"], ", 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, 54_a, fixed[1]) = 1.0;" "(G1, 54_a, fixed[2]) = 0.0;" 
"(G1, 54_b, fixed[0]) = 1.0;" "(G1, 54_b, fixed[1]) = 1.0;" "(G1, 54_b, fixed[2]) = 0.0;" 
"(G1, 44_a, fixed[0]) = 1.0;" "(G1, 44_a, fixed[1]) = 0.0;" "(G1, 44_a, fixed[2]) = 1.0;" 
"(G1, 44_c, fixed[0]) = 1.0;" "(G1, 44_c, fixed[1]) = 0.0;" "(G1, 44_c, fixed[2]) = 1.0;" 
"(G2, 54_a, fixed[0]) = 1.0;" "(G2, 54_a, fixed[1]) = 1.0;" "(G2, 54_a, fixed[2]) = 0.0;"
"(G2, 54_b, fixed[0]) = 1.0;" "(G2, 54_b, fixed[1]) = 1.0;" "(G2, 54_b, fixed[2]) = 0.0;" 
"(G2, 44_a, fixed[0]) = 1.0;" "(G2, 44_a, fixed[1]) = 0.0;" "(G2, 44_a, fixed[2]) = 1.0;" 
"(G2, 44_c, fixed[0]) = 1.0;" "(G2, 44_c, fixed[1]) = 0.0;" "(G2, 44_c, fixed[2]) = 1.0;"
  

Итак, исходя item.map из желаемого результата, в G1 не должно быть элемента 44_c, а в G2 не должно быть элементов 54_a и 44_a

Желаемый результат:

 > vec
"(G1, 54_a, fixed[0]) = 1.0;" "(G1, 54_a, fixed[1]) = 1.0;" "(G1, 54_a, fixed[2]) = 0.0;" 
"(G1, 54_b, fixed[0]) = 1.0;" "(G1, 54_b, fixed[1]) = 1.0;" "(G1, 54_b, fixed[2]) = 0.0;" 
"(G1, 44_a, fixed[0]) = 1.0;" "(G1, 44_a, fixed[1]) = 0.0;" "(G1, 44_a, fixed[2]) = 1.0;" 
"(G2, 54_b, fixed[0]) = 1.0;" "(G2, 54_b, fixed[1]) = 1.0;" "(G2, 54_b, fixed[2]) = 0.0;"
"(G2, 44_c, fixed[0]) = 1.0;" "(G2, 44_c, fixed[1]) = 0.0;" "(G2, 44_c, fixed[2]) = 1.0;"
  

Ответ №1:

Вот идея. Я преобразовал ваш item.map набор данных в длинный формат. Поэтому item.map получил ту же структуру, что и ваш старый набор df данных, но с дополнительным столбцом used с требуемыми 0 и 1.

На следующем шаге я добавил if -function в цикл, поэтому в него будут включены только строки с 1 vec .

 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","54_b","44_a","44_c"),
  group.1 = c(1,1,1,0),
  group.2 = c(0,1,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"], ", ", item.map2[i, "item.id"],
                ", 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, 54_a, fixed[1]) = 1.0;" "(G1, 54_a, fixed[2]) = 0.0;"
 [4] "(G1, 54_b, fixed[0]) = 1.0;" "(G1, 54_b, fixed[1]) = 1.0;" "(G1, 54_b, fixed[2]) = 0.0;"
 [7] "(G1, 44_a, fixed[0]) = 1.0;" "(G1, 44_a, fixed[1]) = 0.0;" "(G1, 44_a, fixed[2]) = 1.0;"
[10] "(G2, 54_b, fixed[0]) = 1.0;" "(G2, 54_b, fixed[1]) = 1.0;" "(G2, 54_b, fixed[2]) = 0.0;"
[13] "(G2, 44_c, fixed[0]) = 1.0;" "(G2, 44_c, fixed[1]) = 0.0;" "(G2, 44_c, fixed[2]) = 1.0;"