Объединение двух токенов-dataframe с неравным количеством строк в списке - PullRequest
0 голосов
/ 15 марта 2019

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

df1  name               df2   word  
1    john               1     john
2    jesse              2     eats 
3    jonathan           3     chocolate     
                        4     jesse
                        5     loves
                        6     football  
                        7     jonathan   
                        8     wants
                        9     another
                        10    beer

Я хочу, чтобы вывод был в списке. например:

list()
[[1]]
john
[1]
john eats chocolate

Я пробовал цикл for, но в списке оказалось по одному слову:

final = list()
J = length(df2$word)
K = length(df1$name)

for (i in 1:K){
  for (j in 1:L){
    if (str_detect(df1$name[i], df2$word[j] )== TRUE) {
      final[j] <- df1$name[i]
    } else { paste0(df2$word[j], collapse = " ") }
  }
} 

выход: * +1010 *

[[1]]
john
[[2]]
eats
[[3]]
chocolate
[[4]]
jesse
[[5]]
loves
[[6]]
football
[[7]]
jonathan
[[8]]
wants
[[9]]
another
[[10]]
beer

Один из моих коллег сказал мне, что это должно быть в цикле while. Надеюсь, кто-то может помочь объяснить, в чем проблема. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Код будет лучше, если вы сможете лучше обрабатывать свои данные или хранить в лучшем формате. В зависимости от моего понимания вашей проблемы, я думаю, это то, что вы ищете. Но это слишком специфично для этой проблемы.

df1 <- data.frame(name = c("john", "jesse", "jonathan"), stringsAsFactors = F)
df2 <- data.frame(word = c("john", "eats", "chocolates", "jesse", "loves",
                           "football", "jonathan", "wants", "another", "beer"), stringsAsFactors = F)
K = length(df1$name)
L = length(df2$word)

# get name = word indices
df2_index = c()
for (i in 1:K){
  for (j in 1:L){
    if (identical(df1$name[i], df2$word[j] )) {
      df2_index <- c(df2_index, j) # get indices of the similar names from 'word'
    } 
  }
} 

# paste sentences
final <- list()
for(i in 1:length(df2_index)-1){
  final[i] <- paste(df2$word[(df2_index[i]) : (df2_index[i+1] - 1)], collapse = " ")
}
final[i] <- paste(df2$word[df2_index[i]:(length(df2$word))] , collapse = " ") # only for last 'name'
names(final) <- df1$name # renaming list names

Выход:

> final
$john
[1] "john eats chocolates"

$jesse
[1] "jesse loves football"

$jonathan
[1] "jonathan wants another beer"
0 голосов
/ 15 марта 2019

Для ваших целей вы можете просто оставить все в отдельных списках.Мы ничего не выиграем, если поместим их в кадры данных для этого упражнения, потому что они все одного класса объектов.

Похоже, что вы хотите составить предложения, просматривая несколько списков слов.Я позволил себе перестроить ваши списки слов в разные категории (имена / существительные, глаголы и прямые объекты), чтобы каждая итерация составляла полное предложение.Приведенный ниже код создаст список, где каждый элемент представляет собой строку символов (предложение) с именем в предложении в качестве имени элемента списка.

Приветствия,

list_name = c("john", "jesse", "jonathon")
list_verb = c("likes", "loves", 'plays', "wants")
list_direct_object = c("football", "another beer", "chocolate")

final = list()

n = 1
for (i in 1:length(list_name)){
  for (j in 1:length(list_verb)){
    for(k in 1:length(list_direct_object)){
      final[[n]] = paste(list_name[i], list_verb[j], list_direct_object[k])
      names(final[[n]]) <- list_name[i]
     n=n+1
    }
  }
}

Вот первые четыре элемента в списке (всего 36):

# [[1]]
# john 
# "john likes football" 
# 
# [[2]]
# john 
# "john likes another beer" 
# 
# [[3]]
# john 
# "john likes chocolate" 
# 
# [[4]]
# john 
# "john loves football" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...