我想比较两个列表(两行数据帧)并计算两个列表之间的差异.
例如:
list1=a,b,c,a
list2=a,a,d,d
Run Code Online (Sandbox Code Playgroud)
列表1的两个元素在列表2中
我能够用循环和求和来做到这一点,但效率非常低.在R中有任何功能吗?
我检查了setdiff和比较包,但没有发现任何有用的东西.
谢谢你的想法,
文森特
我的功能如下:
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)
}
Run Code Online (Sandbox Code Playgroud)
一个要点:你的列表不是R列表 - 这有点特别.你正在使用矢量:
R> is.vector(l1)
[1] TRUE
R> is.list(l1)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
list1如果它们是向量,则不调用变量.
由于你有一个向量,有很多可能性开放.
该%in%运营商
R> l1 = c("a", "b", "c", "d")
R> l2 = c("a", "a", "d", "d")
R> l1[l1 %in% l2]
[1] "a" "d"
Run Code Online (Sandbox Code Playgroud)或者使用 is.element
R> l1[is.element(l1, l2)]
[1] "a" "d"
Run Code Online (Sandbox Code Playgroud)还有unique:
R> unique(l2)
[1] "a" "d"
Run Code Online (Sandbox Code Playgroud)
继以@mrdwab您的意见,您可以使用组合数出现的次数sapply和unique
sapply(unique(l1), function(i) sum(i==l2))
Run Code Online (Sandbox Code Playgroud)
i==l2检查成员资格,sum计算TRUE出现的次数,sapply基本上只是for循环unique(l1)
R> sapply(unique(l1), function(i) sum(i==l2))
a b c d
2 0 0 2
Run Code Online (Sandbox Code Playgroud)@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
Run Code Online (Sandbox Code Playgroud)