Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个不同列中的字符串,其中每个单元格都包含重复的值,并在R中对其进行计数_R_String_Dataframe_Character_String Comparison - Fatal编程技术网

比较两个不同列中的字符串,其中每个单元格都包含重复的值,并在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”应该是这样的