如何将R函数应用于每一行并合并结果



我有一个包含文本数据的数据框架,其中一列包含感兴趣的文本&其他列是与此文本相关的元数据。

text     metadata_1  metadata_2  
x        abc         123         
y        def         456
z        ghi         789

对于单行,我有一个函数:

  • 通过Google自然语言API通过googlelanguager包运行文本,该包返回一组具有各种NLP结果(实体,句子,令牌等)的列表
  • 将返回的"实体"列表对象存储在数据帧中
  • 将实体结果与分析文本的元数据相结合(因此每个实体有一行,并且元数据字段重复)
get_entities <- function(x) {

# run text through google nlp api with gl_nlp()
nlp_result <- x["text"] %>% 
gl_nlp()

# store entities results in dataframe
entities <- as.data.frame(nlp_result[["entities"]]) 

# bind text info with entities into for the analyzed text
bind_cols(x, entities)  
}

输出如下:

text     metadata_1  metadata_2  entity        entity_type
x        abc         123         Joe           PERSON
x        abc         123         Chicago       LOCATION
x        abc         123         World Series  EVENT

但是我想对文本数据集中的每一行执行相同的操作:分析文本字段,从get_nlp()列表输出中分离实体结果,并将这些结果连接回相应的文本元数据。然后,理想情况下,将单个结果合并到一个位置。

text     metadata_1  metadata_2   entity         entity_type
x        abc         123          Joe            PERSON
x        abc         123          Chicago        LOCATION
x        abc         123          World Series   EVENT
y        def         456          2002           DATE
y        def         456          New York       LOCATION
z        ghi         789          2016           DATE

我一直在寻找迭代我的数据集的最佳方法&把结果结合起来。是否有一种方法可以最有意义地将来自函数的数据集组合为for循环或apply的一部分?

我们可以使用rowwise,将get_entities应用于cur_data(),将输出存储在listunnestlist输出

library(dplyr)
library(tidyr)
df1 %>%
rowwise %>%
summarise(out = list(get_entities(cur_data())), .groups = 'drop') %>%
unnest(c(out))

如果我们想在*apply中这样做,循环遍历行序列,提取数据并应用get_entities

lapply(seq_len(nrow(df1)), function(i)
get_entities(df1[i,, drop = FALSE]))

您可以为每一行apply函数get_entities并合并结果。

result <- do.call(rbind, apply(df, 1, get_entities))