我想比较两个列表(数据帧的两行),并计算两个列表之间的差异。
例如:
list1=a,b,c,a
list2=a,a,d,d
列表1的两个元素在列表2中
我可以通过循环和求和来做到这一点,但效率很低。在R中有这样的函数吗?
我已经检查了setdiff和compare包,但没有发现任何有用的东西。
谢谢你的想法,
Vincent
我的功能看起来像:
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%
操作员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
检查成员资格,sum
计算TRUE出现的次数,sapply
基本上只是unique(l1)
上的for循环R> sapply(unique(l1), function(i) sum(i==l2)) a b c d 2 0 0 2
@mrdwab的一个非常好的建议是使用
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
你试过这样的东西吗?
list1 = c("a", "b", "c", "a")
list2 = c("a", "a", "d", "d")
list2 %in% list1
# [1] TRUE TRUE FALSE FALSE
更新
既然你在寻找频率,我也认为考虑table
是很自然的。
总的来说,我觉得问题有些令人困惑。您的问题指出,您正在查找一个列表(list2
)中出现在另一个列表中(list1
)的次数,但在接受的答案中(在我的coSums(table...
示例中,您也在计算d
,在list1
中没有出现。因此,我提供了最后一个使用table
和%in%
的示例,它与您的问题相匹配,但可能不是您想要的。这里是:
table(list2[which(list2 %in% list1)])
# a
# 2