比较两个不同列中的字符串,其中每个单元格都包含重复的值,并在R中对其进行计数
我正在使用一个数据框,它有两列,其中包含“单词”(字母-数字),例如:比较两个不同列中的字符串,其中每个单元格都包含重复的值,并在R中对其进行计数,r,string,dataframe,character,string-comparison,R,String,Dataframe,Character,String Comparison,我正在使用一个数据框,它有两列,其中包含“单词”(字母-数字),例如: 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")) df一个选项是 library(tidyverse) f1 <- function(
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"))
df一个选项是
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
库(tidyverse)
f1%
选择(colNm)%>%
行名到列('rn')%>%
单独的行(!!rlang::sym(colNm))%>%
添加计数(rn,!!rlang::sym(colNm))%>%
联合(colN,!!rlang::sym(colNm),n,sep=“*”)%>%
分组依据(rn)%>%
将_总结在(1,~toString(唯一的(.))%>%
选择(-rn)
}
df1%
突变所有(str提取所有“\\w+”)%>%
pmap_chr(~keep(.y,.y%在%intersect(.x,.y))中%>%
toString)%%>%
变异(df,C=)
map_dfc(名称(df1),f1,dat=df1)%>%
重命名所有(~str_c(“col”,1:3))%>%
绑定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
#可乐
#1 M05*2,V01*1
#2K45*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
库(tidyverse)
f1%
选择(colNm)%>%
行名到列('rn')%>%
单独的行(!!rlang::sym(colNm))%>%
添加计数(rn,!!rlang::sym(colNm))%>%
联合(colN,!!rlang::sym(colNm),n,sep=“*”)%>%
分组依据(rn)%>%
将_总结在(1,~toString(唯一的(.))%>%
选择(-rn)
}
df1%
突变所有(str提取所有“\\w+”)%>%
pmap_chr(~keep(.y,.y%在%intersect(.x,.y))中%>%
toString)%%>%
变异(df,C=)
map_dfc(名称(df1),f1,dat=df1)%>%
重命名所有(~str_c(“col”,1:3))%>%
绑定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
#可乐
#1 M05*2,V01*1
#2K45*1
您可以将sapply
和strsplit
组合使用,如下所示:
myfun <- function(x){
x2 <- sort(table(x), decreasing = T)
paste(names(x2), x2, sep = "*", collapse = ", ")
}
df$col1 <- sapply(strsplit(df$A, split = ", "), myfun)
df$col2 <- sapply(strsplit(df$B, split = ", "), myfun)
df$col3 <- sapply(strsplit(paste(df$A, df$B, sep = ", "), split = ", "), myfun)
您可以这样组合使用sapply
和strsplit
:
myfun <- function(x){
x2 <- sort(table(x), decreasing = T)
paste(names(x2), x2, sep = "*", collapse = ", ")
}
df$col1 <- sapply(strsplit(df$A, split = ", "), myfun)
df$col2 <- sapply(strsplit(df$B, split = ", "), myfun)
df$col3 <- sapply(strsplit(paste(df$A, df$B, sep = ", "), split = ", "), myfun)
我知道它与您的输出结构不完全相同,但出于数据分析的目的,我会重新考虑对其进行重塑。如果每个唯一的单词是另一个数据框中的一行,则更容易看到您想要的内容(“每个单词在A列中出现了多少次?”)
库(dplyr)
df%
未列出()
字数B%
strsplit(“,”)%>%
未列出()
TIBLE(单词=唯一(c(单词A,单词B)))%>%
分组依据(字)%>%
总结(n_A=总和(word==单词A),
n_B=总和(word==words_B),
n_AB=sum(word==intersect(words_A,words_B)),
n_AB_2=最小值(n_A,n_B))
#一个tibble:13x5
单词n_A n_B n_AB n_AB_2
1 F320 1 0 0
2 G30 1 0 0 0 0
3 H67 0 1 0 0
4J450100
5J56200
6 J76 01 0 0
7 K45 1
8L781000
9 M05 3 2 1 2
10 N54 0 1 0 0
11 N98 1 0 0 0
12 S54 0 1 0 0
13 V01 2 1 1
请注意,intersect()
(在数学定义中)删除重复项。当你想考虑重复的时候,我也定义了<代码> nyabab2= min(nsia,nyb)< /c> >列,这是个诀窍。 我知道它不是你的输出的完全相同的结构,但是我会重新考虑它的修改以进行数据分析。如果每个唯一的单词是另一个数据框中的一行,则更容易看到您想要的内容(“每个单词在A列中出现了多少次?”)
库(dplyr)
df%
未列出()
字数B%
strsplit(“,”)%>%
未列出()
TIBLE(单词=唯一(c(单词A,单词B)))%>%
分组依据(字)%>%
总结(n_A=总和(word==单词A),
n_B=总和(word==words_B),
n_AB=sum(word==intersect(words_A,words_B)),
n_AB_2=最小值(n_A,n_B))
#一个tibble:13x5
单词n_A n_B n_AB n_AB_2
1 F320 1 0 0
2 G30 1 0 0 0 0
3 H67 0 1 0 0
4J450100
5J56200
6 J76 01 0 0
7 K45 1
8L781000
9 M05 3 2 1 2
10 N54 0 1 0 0
11 N98 1 0 0 0
12 S54 0 1 0 0
13 V01 2 1 1
请注意,intersect()
(在数学定义中)删除重复项。当你想考虑重复的时候,我也定义了<代码> nyaba2= min(nsia,nyb)< /c> >列,我认为括号不正确,因为第三列现在对同一个单词的A列和B列的出现次数求和,而不是给出相交次数。我认为第三个“col3”类似于Map(函数(x,y)x[x%in%intersect(x,y)],strsplit(as.character(df$B),“,”),strsplit(as.character(df$A),“,”)
我认为括号不正确,因为第三列现在将同一单词的A列和B列中出现的次数相加,而不是给出相交的次数。我认为第三个“col3”应该是这样的