R搜索上面一行的值

时间:2014-06-05 13:33:49

标签: r match

我有一个问题:这个答案似乎适用于比较前一个值和当前行的值 - 但只是同一列中的值。

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;。

重要提示:只应在前一行搜索!

提前感谢!

2 个答案:

答案 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