假设我有一个来自读取以下文件的数据框Foo.csv
A,B,C
1,2,3
2,2,4
1,7,3
Run Code Online (Sandbox Code Playgroud)
我想计算第一行和后续行之间匹配元素的数量。例如,第一行与第二行匹配一个位置,与第三行匹配两个位置。这是一些可以达到预期效果的代码。
foo = read.csv("Foo.csv")
numDiffs = rep(0,dim(foo)[1])
for (i in 2:dim(foo)[1]) {
numDiffs[i] = sum(foo[i,] == foo[1,])
}
print(numDiffs)
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否可以对其进行矢量化以终止循环并可能减少运行时间?我的第一次尝试如下,但它留下了一个错误,因为==
没有为这种类型的比较定义。
colSums(foo == foo[1,])
Run Code Online (Sandbox Code Playgroud)
或者使用矩阵比较的自动回收:
bar <- as.matrix(foo)
c(0, rowSums(t(t(bar[-1, ]) == bar[1, ])))
# [1] 0 1 2
Run Code Online (Sandbox Code Playgroud)
t()
是否有两次,因为回收是按列而不是按行。