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

时间:2017-03-19 04:57:09

标签: r apply

我有一个看起来像这样的数据框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函数,但问题仍然存在

2 个答案:

答案 0 :(得分:2)

我认为你也不需要。

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

答案 1 :(得分: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