Условное зацикливание для получения групповой длины строки - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть фрейм данных с несколькими R * C. Я хочу создать условный цикл, который проверит самую длинную строку в столбце и пометит ее как group1, а затем сравнит ее содержимое с другими строками в столбце на соответствие.Условие состоит в том, что если в столбце присутствует какая-либо строка, соответствующая самой длинной строке, она будет помечена как группа 1. Если присутствует какой-либо новый элемент, она будет помечена как следующая группа.


   STR 
"G,D,E","F"  
"D,E,F","G"
"D,E","F"
"A,B","C"
"C","D"
"A","B"        

Выходные данные должны быть такими:


   STR            Group  
 "G,D,E","F"        1   
 "D,E,F","G"        1
 "D,F","E"          1
 "D,E","F"          1
 "A,B","C"          2
 "C","D"            3 
 "A","B"            2

1 Ответ

0 голосов
/ 29 апреля 2019

Это первый шаг.Я предполагаю, что данная структура данных представляет собой фрейм данных с двумя столбцами, как это выглядит в вашем примере.Вот что я сделал:

str_1 <- c("G,D,E", "D,E,F", "D,E", "A,B", "C", "A")
str_2 <- c("F", "G", "F", "C", "D", "B")
str_df <- data.frame(str_1, str_2)
merged_str <- paste(str_df[,1], str_df[,2], sep=",")
str_list <- strsplit(merged_str, ",")

is_in_group <- function(letters, group){
  for (letter in letters) {
    if(!(letter %in% group)) {
      return(FALSE)
    }
  }
  return(TRUE)
}

groups <- list() 
groups[[1]] <- str_list[[1]]
group_vec <- rep(0, length(str_list))
group_vec[1] <- 1

for (i in 2:length(str_list)) {
  curr_letters <- str_list[[i]]
  new_group = TRUE
  for (g in 1:length(groups)) {
    if(is_in_group(curr_letters, groups[[g]])) {
      group_vec[i] <- g
      new_group = FALSE
      break
    }
  }
  if (new_group) {
    groups[[length(groups)+1]] <- curr_letters
    group_vec[i] <- length(groups)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...