我想比较两个列表(数据框的两行)并计算两个列表之间有多少差异。
例如:
list1=a,b,c,a
list2=a,a,d,d
列表 1 的两个元素在列表 2 中
我可以用循环和求和来做到这一点,但效率很低。在 R 中是否有任何功能可以做到这一点?
我检查了 setdiff 和 compare 包,但没有找到任何有帮助的东西。
谢谢你的想法,
文森特
我的功能看起来像:
NRebalancing=function(NamePresent)
{
Nbexchange=NamePresent[,2]
Nbexchange=NamePresent[1,2]=0
for (i in 2:nrow(NamePresent))
{
print(i)
compteur=0
NameNeeded=NamePresent[i,]
NameNeeded=unique(NameNeeded)
NameNeeded=na.omit(NameNeeded)
for(j in 2:length(NameNeeded))
#j=1 correspond a une date
{
compteur = compteur+(abs(sum(NamePresent[i,]==as.character(NameNeeded[j]))-sum(NamePresent[i-1,]==as.character(NameNeeded[j]))))
}
Nbexchange[i]=compteur
}
return(Nbexchange)
}
最佳答案
一个要点:您的列表不是 R 列表 - 这有点特别。您正在使用向量:
R> is.vector(l1)
[1] TRUE
R> is.list(l1)
[1] FALSE
不要调用变量
list1
如果它们是向量。因为你有一个向量,所以有很多可能性。
%in%
运算符(operator)R> l1 = c("a", "b", "c", "d")
R> l2 = c("a", "a", "d", "d")
R> l1[l1 %in% l2]
[1] "a" "d"
is.element
R> l1[is.element(l1, l2)]
[1] "a" "d"
unique
:R> unique(l2)
[1] "a" "d"
在您对@mrdwab 发表评论之后,您可以使用
sapply
的组合来计算出现次数。和 unique
sapply(unique(l1), function(i) sum(i==l2))
i==l2
检查成员(member)资格,sum
计算 TRUE 出现的次数和 sapply
基本上只是 unique(l1)
上的 for 循环R> sapply(unique(l1), function(i) sum(i==l2))
a b c d
2 0 0 2
table
和 colSums
:R> table(l1, l2)
l2 l1
a d
a 1 0
b 1 0
c 0 1
d 0 1
R> colSums(table(l1, l2))
a d
2 2
关于R:列表 2 中有多少列表 1 的元素/出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501127/