L oop для обозначения токенов с их соответствующим значением в r - PullRequest
3 голосов
/ 31 марта 2020

Это должно быть довольно просто; однако, я не могу понять это правильно. Я получил следующий список:

list <- list(c("sofa", "couch"), 
         c("fridge"),
         c("desk", "table", "brown"),
         c("window", "clean"),
         c("speaker"))

Который я пытаюсь преобразовать в следующий формат (как фрейм данных)

table <- data.frame(word = c("sofa", "couch", "fridge", "desk", "table", "brown", "window", "clean", "speaker"),
                label = c("sofa couch", "sofa couch", 
                          "fridge", 
                          "desk table brown", "desk table brown", "desk table brown",
                          "window clean",
                          "window clean",
                          "speaker"))

Я создал этот l oop, который имеет смысл я, но это не работает. Я не могу понять, почему или если это лучший способ сделать это

table <- data.frame(word = character(), label = character(), stringsAsFactors = FALSE)
value <- 0

for(i in 1:length(list)){
  for(j in 1:length(list[[i]])){
    value <- c(list[[i]][j], str_c(list[[i]], collapse = " "))
    table <- rbind(table, value)
  }
}

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Другой вариант - stack

stack(setNames(list, sapply(list, paste, collapse = " ")))
#   values              ind
#1    sofa       sofa couch
#2   couch       sofa couch
#3  fridge           fridge
#4    desk desk table brown
#5   table desk table brown
#6   brown desk table brown
#7  window     window clean
#8   clean     window clean
#9 speaker          speaker
1 голос
/ 31 марта 2020

В базе R вы можете unlist list получить word и повторить объединенные элементы каждого list в зависимости от их длины.

data.frame(word = unlist(list), 
           label = rep(sapply(list, paste, collapse = " "), lengths(list)))

#     word            label
#1    sofa       sofa couch
#2   couch       sofa couch
#3  fridge           fridge
#4    desk desk table brown
#5   table desk table brown
#6   brown desk table brown
#7  window     window clean
#8   clean     window clean
#9 speaker          speaker
0 голосов
/ 31 марта 2020

Быстро переписав свой вопрос, я выяснил, что не так с кодом. Однако решения, предложенные ранее Ронаком и Маркусом, более компактны и имеют больше смысла.

Чтобы сделать это с помощью l oop, я обнаружил, что некоторые параметры отсутствуют

for(i in 1:length(list)){
  for(j in 1:length(list[[i]])){
    value <- data.frame(word = list[[i]][j], label = str_c(list[[i]], collapse = " "), stringsAsFactors = FALSE)
    table <- rbind(table, value)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...