使用更准确的数据集示例修改了问题
我有几个不同的列表,每个列表都包含许多字符。我在这里写了一个非常简短的例子
List1 <- "A + B + C + D + E:F + F:E"
List2<- "A + B + C + E:F + F:E + G:H + H:G"
List3 <- "J + K + L + L:H + L:H1"
我试图通过所有这些列表查找出现的频率,但某些项目的重复导致了问题。
通过大量循环,以及 X %in% Y、strsplit(在“:”之前和之后拆分),我得到了这个
sig_var8
var count
1 0 0
2 A 2
3 B 2
4 C 2
5 D 1
6 E:F 2
7 F:E 2
8 G:H 1
9 H:G 1
10 J 1
11 K 1
12 L 1
13 L:H 1
14 L:H1 1
我想要的是这样的:
sig_var8
var count
1 0 0
2 A 2
3 B 2
4 C 2
5 D 1
6 E:F 2
7 G:H 1
8 J 1
9 K 1
10 L 1
11 L:H 1
12 L:H1 1
注意:在列表1中,E:F和F:E被认为是相同的并且只出现一次。与列表 2 相同,其中 G:H == H:G,并且只计数一次。请注意,grep 不是最好的,因为列表 3 中的 L:H 和 L:H1 不同,它们需要单独计数(因此有 %in%)。
这是我编写的代码:
sig_var8<-data.frame(matrix(data=0,nrow=1,ncol=2))
colnames(sig_var8)<-c("var","count")
sig_var8[,1]<-as.character(sig_var8[,1])
sig_var8[,2]<-as.numeric(sig_var8[,2])
for(list in 1:3){
temp_list<-get(paste0("List",list)) #get the equation above
assign(paste0("List",list,"a"), gsub(" ","",temp_list)) #remove all spaces in the sentence
assign(paste0("List",list,"a_split"), strsplit(get(paste0("List",list,"a")),"[+]")) #split where "+" are
temp_listA<-get(paste0("List",list,"a_split"))[[1]]
for (item in 1:length(temp_listA)){
if(isTRUE(temp_listA[item] %in% sig_var8[,1])){
row_n<-which(sig_var8[,1]==temp_listA[item])
sig_var8[row_n,2]<-sig_var8[row_n,2]+1
}
if(isFALSE(temp_listA[item] %in% sig_var8[,1])){
row_n<-nrow(sig_var8)
sig_var8[row_n+1,1]<-temp_listA[item]
sig_var8[row_n+1,2]<-1
}
}
}
最佳答案
也许像下面这样的东西可以满足您的需求。
Lst <- mget(ls(pattern = "^List"))
Lst <- lapply(Lst, function(x) {
L <- strsplit(x, ":")
res <- sapply(L, function(y){
paste(sort(y), collapse = ":")
})
unique(res)
})
table(unlist(Lst))
#
# A B C D E:F G:H H:L H1:L J K L
# 2 2 2 1 2 1 1 1 1 1 1
关于r - 统计出现次数,字符串顺序只统计1x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733188/