基于其他列的新列

New column based on other columns

我有两列(V1 和 V2)包含字符信息。我想用这些字符的“总和”创建第三列。就像两列(V1 和 V2)的字符向量中逗号“,”之间的唯一值。

我想从这里开始:

示例数据:

data.frame(V1 = c('A','A','A','A','B','B','','C'),
           V2 = c('A, B','A','B','','A, C','A, B','A',''))


  V1   V2
1  A    A, B
2  A    A
3  A    B
4  A     
5  B    A, C
6  B    A, B
7       A
8  C

为此:

   V3
1   AB
2   A
3   AB
4   A
5   ABC
6   AB
7   A
8   C

我们可以拆分列 'V2',得到两列的 unionpaste

data.frame(V3 = mapply(\(x, y) paste(sort(union(x, y)), 
  collapse = ""), strsplit(df1$V2, ",\s*"), df1$V1))

-输出

   V3
1  AB
2   A
3  AB
4   A
5 ABC
6  AB
7   A
8   C

这种做法先把pasteV1V2连在一起,然后用strsplit拆分字符串,然后只保留unique字符,然后折叠他们在一起。

df$V3 <- sapply(strsplit(gsub(",\s", "", paste0(df$V1, df$V2)), ""), 
                             function(x) paste0(sort(unique(x)), collapse = ""))

   V3
1  AB
2   A
3  AB
4   A
5 ABC
6  AB
7   A
8   C

这是一个使用 purrrdplyr 的简洁方法。您可能可以将其压缩成更少的行,但这足够可读。

  1. 用逗号分隔文本。
  2. 对两列进行排序和合并。
  3. 将它们重新粘贴在一起。
library(dplyr)
library(purrr)
library(stringr)

df %>% 
  modify(str_split, ",\s") %>% 
  mutate(V3 = map2(V1, V2, compose(sort, unique, c))) %>%
  mutate(V3 = map_chr(V3, paste, collapse = ""))

使用正则表达式:

gsub("(.)(?=.*\1)|,| ", "", paste(df$V1, df$V2), perl = TRUE)

# [1] "AB"  "A"   "AB"  "A"   "BAC" "AB"  "A"   "C"