r - 比较来自两个不同列的字符串,其中每个单元格包含重复值并在 R 中计算它们
问题描述
我正在使用具有两列包含“单词”(字母-数字-数字)的数据框:
df <- data.frame(A = c("V01, G30, V01, M05, M05, M05, N98", "J56, K45, L78, J56"),
B = c("J45, H67, M05, N54, M05, J76, V01", "S54, F32, K45"))
字符串并不总是相同的长度,它们包含不同的单词。有些词是相似的,有些甚至是重复的。我想获得的是三个新列。
第一列给出了每个单词在 A 列中出现的次数,第二列给出了每个单词在 B 列中出现的次数,最后第三列给出了每个单词在 A 列和 B 列的交叉点中出现的次数. 输出应如下所示:
df <- data.frame(A = c("V01, G30, V01, M05, M05, M05, N98", "J56, K45, L78, J56"),
B = c("J45, H67, M05, N54, M05, J76, V01", "S54, F32, K45"),
col1 = c("V01*2, G30*1, M05*3, N98*1", "J56*2, K45*1, L78*1"),
col2 = c("J45*1, H67*1, M05*2, N54*1, J76*1, V01*1", "S54*1, F32*1, K45*1"),
col3 = c("V01*1, M05*2", "K45*1"))
我真的不知道从哪里开始,所以任何帮助将不胜感激!!!
解决方案
一个选择是
library(tidyverse)
f1 <- function(dat, colNm) {
dat %>%
select(colNm) %>%
rownames_to_column('rn') %>%
separate_rows(!! rlang::sym(colNm)) %>%
add_count(rn, !! rlang::sym(colNm)) %>%
unite(colN, !! rlang::sym(colNm), n, sep="*") %>%
group_by(rn) %>%
summarise_at(1, ~ toString(unique(.))) %>%
select(-rn)
}
df1 <- df %>%
mutate_all(str_extract_all, "\\w+") %>%
pmap_chr(~ keep(.y, .y %in% intersect(.x, .y)) %>%
toString) %>%
mutate(df, C = .)
map_dfc(names(df1), f1, dat = df1) %>%
rename_all(~ str_c("col", 1:3)) %>%
bind_cols(df, .)
# A B col1 col2
#1 V01, G30, V01, M05, M05, M05, N98 J45, H67, M05, N54, M05, J76, V01 V01*2, G30*1, M05*3, N98*1 J45*1, H67*1, M05*2, N54*1, J76*1, V01*1
#2 J56, K45, L78, J56 S54, F32, K45 J56*2, K45*1, L78*1 S54*1, F32*1, K45*1
# col3
#1 M05*2, V01*1
#2 K45*1
推荐阅读
- android - 从通知中打开当前正在运行的子活动,而不是创建新活动
- python - Python win32com模块在外部应用程序中保存命令
- java - “fieldType”:具有完全限定名称的“Sig”不以“signature”为前缀创建 java.lang.ClassCastException
- python - 我可以在 Vue 中使用 Django 身份验证吗
- perforce - 如何在 Perforce 中创建一个新的 Shelve Changelist
- javascript - 导出函数会加载整个文件
- node.js - 寻找无服务器的 npm 重建上的 ENOENT 不一致
- python - 仅使用 keras 对浮点数组进行单热编码
- python - 如何删除列表列表中的重复值?
- sql-server - 查询中的 SQL Server 业务登录