我一直在将包含多个类别信息的单个合并列解析为唯一类别的独立列。我一直在使用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
的相同位置的数据。
答案 0 :(得分:2)
执行此操作的一种方法是将Map
与setdiff
一起使用,该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