是否可以解决 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
我有一个数据框 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