如何根据R中不同列中先前提取的字符串从合并列中提取字符串?

时间:2016-08-16 21:58:27

标签: r string parsing dataframe split

我一直在将包含多个类别信息的单个合并列解析为唯一类别的独立列。我一直在使用stringr来识别需要从单列中分离出来的类别模式。

我能够分离包含唯一,重复和可识别模式的所有类别信息,但现在我们的任务是提取不具有明显可提取模式的类别信息。

以下是一个基本的示例设置:

col1 <- c("a1 b1 apple c1","a2 b2 fruit c2","a3 b3 bunny(1) c3","a4 b4 x5  c4")
col2 <- c("b1","b2","b3","b4")
col3 <- c("a1","a2","a3","a4")
col4 <- c("c1","c2","c3","c4")

dat <- data.frame(col1,col2,col3,col4)

所以现在我需要在dat$col1的第三个位置提取该术语。

>dat$col5
 apple
 fruit
 bunny(1)
 x5

我想基于先前在dat[,c(2,3,4)]中提取的字符串来执行此操作。这是一个非常基本的例子,我试图找到最可靠的方法来提取可能不均匀地位于dat$col1的相同位置的数据。

2 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是将Mapsetdiff一起使用,该col1将捕获col2, 3, 4中未找到的v1 <- unlist(Map(setdiff, strsplit(dat$col1, ' '), strsplit(apply(dat[,-1], 1, paste, collapse = ' '), ' '))) dat$col5 <- v1[v1 != ''] dat # col1 col2 col3 col4 col5 #1 a1 b1 apple c1 b1 a1 c1 apple #2 a2 b2 fruit c2 b2 a2 c2 fruit #3 a3 b3 bunny(1) c3 b3 a3 c3 bunny(1) #4 a4 b4 x5 c4 b4 a4 c4 x5 字样。

.bootstrap .table

请注意,您的变量必须是字符(而不是因素)才能使其正常工作

答案 1 :(得分:1)

这是另一个实现,类似于@Sotos使用setdiff的想法,使用purrr包。注意 - 我对purrr很新,所以可能有更有效的方法来做到这一点。

library(purrr)

col1 <- c("a1 b1 apple c1","a2 b2 fruit c2","a3 b3 bunny(1) c3","a4 b4 x5  c4")
col2 <- c("b1","b2","b3","b4")
col3 <- c("a1","a2","a3","a4")
col4 <- c("c1","c2","c3","c4")

dat <- data.frame(col1,col2,col3,col4)

extract_val <- function(df, input_col, val_cols) {
  # Coerce factors to character. Could omit this if they are already character
  df <- purrr::map_df(df[, c(input_col, val_cols)], as.character)

  # Split the input column on whitespace
  split_col <- strsplit(df[[input_col]], "\\s+")

  # Map over rows, combining the val columns into a list-column of vectors
  temp_df <- purrr::by_row(df[, val_cols], unlist, .collate = "list")

  # Parallel map over the split column and the newly created list-column, and use
  # setdiff to extract the value
  purrr::map2_chr(split_col, temp_df[[".out"]], setdiff)
}

dat$col5 <- extract_val(dat, "col1", c("col2", "col3", "col4"))

dat
##                col1 col2 col3 col4     col5
## 1    a1 b1 apple c1   b1   a1   c1    apple
## 2    a2 b2 fruit c2   b2   a2   c2    fruit
## 3 a3 b3 bunny(1) c3   b3   a3   c3 bunny(1)
## 4      a4 b4 x5  c4   b4   a4   c4       x5