我有一个问题:这个答案似乎适用于比较前一个值和当前行的值 - 但只是同一列中的值。
Problems with speeding up loop in R
如果要将row2,column2的值与row1中的任何列进行比较,怎么办?有解决方案吗?
set.seed(4)
nr <- 1000
mydf <- data.frame(a=sample(letters[1:3], nr, repl=TRUE),
b=sample(letters[1:3], nr, repl=TRUE),
c=sample(letters[1:3], nr, repl=TRUE),
d=sample(letters[1:3], nr, repl=TRUE),
stringsAsFactors=FALSE)
这将是矩阵,但是,应该计算一行中有多少值与前一行的值匹配。例如,
a,b,c,d,e,f,g
c,e,h,i,j,NA,NA
NA,i,NA,NA,a,f,NA
示例输出: NA,2,1
- &GT;这意味着两场比赛,&#34; c&#34;和&#34; e&#34;。请注意,矩阵的每个字段中应该只有唯一的字符值,并且应该有&#34; NAs&#34;这不应算作&#34;匹配&#34;。
重要提示:只应在前一行搜索!
提前感谢!
答案 0 :(得分:2)
DF <- read.table(text="a,b,c,d,e,f,g
c,e,h,i,j,NA,NA
NA,i,NA,NA,a,f,NA", sep=",", header=FALSE)
DF1 <- as.data.frame(t(DF))
mapply(function(x, y) length(na.omit(intersect(x, y))),
DF1[, -1], DF1[, -ncol(DF1)])
#V2 V3
# 2 1
答案 1 :(得分:1)
一种方法是迭代行号,检查每行中前一行中出现的元素:
counts <- c(NA, sapply(2:nrow(mydf), function(i) {
sum(match(mydf[i, ], mydf[i-1, ], incomparables=NA, nomatch=0) > 0)
}))
head(counts, 20)
## [1] 0 3 4 4 4 4 3 4 4 4 2 4 4 3 4 2 4 4 2 2