基于其他列的新列
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',得到两列的 union
和 paste
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
这种做法先把paste
V1
和V2
连在一起,然后用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
这是一个使用 purrr
和 dplyr
的简洁方法。您可能可以将其压缩成更少的行,但这足够可读。
- 用逗号分隔文本。
- 对两列进行排序和合并。
- 将它们重新粘贴在一起。
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"
我有两列(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',得到两列的 union
和 paste
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
这种做法先把paste
V1
和V2
连在一起,然后用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
这是一个使用 purrr
和 dplyr
的简洁方法。您可能可以将其压缩成更少的行,但这足够可读。
- 用逗号分隔文本。
- 对两列进行排序和合并。
- 将它们重新粘贴在一起。
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"