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