是否可以解决 apply() 在 r 中作用的列号或行号

is it possible to address the column or row number that apply() is acting on in r

我有一个数据框 final 看起来像这样

  1 2 3 4 5 6 7 8 9 10 mCount   
1 D D R R D D R R R R  0    
2 R R D D D R D D R D  0    
3 D D R R D D R R D D  0    
4 R R R R D D R R R R  0 

每两列应该匹配。但是请注意,在第 2 行中,有几个相邻列不匹配的实例。我的最终目标是计算 mCount 列中这些不匹配实例的实例。

我已经使用 for 循环成功地做到了这一点

for(i in 1:10){ #cycle through columns
  if(i %% 2 == 1 %% 2){ #every other column
    for(j in 1:4){ #cycle through rows
      if(final[j,i] != final[j,i+1]){ #compare adjacent values
          final$mCount[j] <- final$mCount[j] + 1 #adjust mCount accordingly
      }
    }
  }
}

我想做的是在不使用 for 循环的情况下执行此操作,可能会使用 apply 函数。我的问题是我不知道如何处理 apply 正在处理的列以进行比较。

有谁知道如何执行此操作或可能具有相同结果的其他解决方案吗?

编辑:我实际上认为我会使用 rollapply 函数,但问题仍然存在

我觉得你也不需要。

final <- read.table(textConnection("1 2 3 4 5 6 7 8 9 10 mCount   
D D R R D D R R R R  0    
R R D D D R D D R D  0    
D D R R D D R R D D  0    
R R R R D D R R R R  0
"), header = TRUE, stringsAsFactors = FALSE)[,-11]

我认为诀窍是意识到您需要比较奇数列和偶数列。

final$mCount <- rowSums(final[c(1,3,5,7,9)] != final[1+c(1,3,5,7,9)])
final
#   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 mCount
# 1  D  D  R  R  D  D  R  R  R   R      0
# 2  R  R  D  D  D  R  D  D  R   D      2
# 3  D  D  R  R  D  D  R  R  D   D      0
# 4  R  R  R  R  D  D  R  R  R   R      0

(您应该能够忽略通过使用带有数字列名的 read.table 引入的列名。)

由于硬编码,这不是很普遍,但应该不难概括:

odds <- seq_len(ncol(final)) %% 2 != 0
final[odds] != final[!odds]
#         X1    X3    X5    X7    X9
# [1,] FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE  TRUE FALSE  TRUE
# [3,] FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE
rowSums(final[!odds] != final[odds])
# [1] 0 2 0 0

以下解决方案可以推广到大于 2 的组:

m<-matrix(c( "D", "D", "R", "R", "D", "D", "R", "R", "R", "R", "R", "R", "D",
             "D", "D", "R", "D", "D", "R", "D", "D", "D", "R", "R", "D", "D", 
             "R", "R", "D", "D", "R", "R", "R", "R", "D", "D", "R", "R", "R",    "R"),byrow=T,ncol=10)

# size of the group    
n=2
g <- rep(seq(1,ncol(m)/n),each=n)
find <- function(d)
{
    sum(sapply(split(d,g),function(d) nlevels(as.factor(d))-1))
}
t<-apply(m, 1, find)

data.frame(m,mCount=t)
#  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 mCount
#1  D  D  R  R  D  D  R  R  R   R 0
#2  R  R  D  D  D  R  D  D  R   D 2
#3  D  D  R  R  D  D  R  R  D   D 0
#4  R  R  R  R  D  D  R  R  R   R 0