我有以下格式的数据,称为DF(这只是一个简化的简化样本):
eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0 random
1 1 1500 1500 100 120 40 232342
2 2 1000 1250 100 120 40 11843
3 3 1250 1250 100 120 40 981340234
4 4 1000 1187.5 100 120 40 4363453
5 1 2000 2000 200 100 40 345902
6 1 3000 3000 150 90 10 943
7 1 2000 2000 90 90 100 9304358
8 2 1800 1900 90 90 100 284333
但是,eval.count列不正确,我需要修复它。它应该通过查看前面的行来报告(green.h.0,green.v.0和offset.0)具有相同值的行数。
上面的示例使用了预期值,但假设它们不正确。
如何添加一个新列(比如“count”),它会计算所有以前具有相同指定变量值的行?
我已经得到了一个类似的问题的帮助,即只选择具有相同值的指定列的所有行,所以我想我可以只是写一个循环,但对我来说似乎效率低下。
答案 0 :(得分:9)
好的,我们首先在简单的情况下进行,只需要一列。
> data <- rep(sample(1000, 5),
sample(5, 5))
> head(data)
[1] 435 435 435 278 278 278
然后你可以用rle来计算出连续的序列:
> sequence(rle(data)$lengths)
[1] 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1
或者完全:
> head(cbind(data, sequence(rle(data)$lengths)))
[1,] 435 1
[2,] 435 2
[3,] 435 3
[4,] 278 1
[5,] 278 2
[6,] 278 3
对于具有多列的情况,可能有很多方法可以应用此解决方案。最简单的可能只是paste
您关心的列,以形成单个向量。
答案 1 :(得分:1)
好吧,我使用了我在另一个问题上得到的答案,并制定了一个我觉得可行的循环。这就是我将要使用的内容:
cmpfun2 <- function(r) {
count <- 0
if (r[1] > 1)
{
for (row in 1:(r[1]-1))
{
if(all(r[27:51] == DF[row,27:51,drop=FALSE])) # compare to row bind
{
count <- count + 1
}
}
}
return (count)
}
brows <- apply(DF[], 1, cmpfun2)
print(brows)
如果我犯了错误,请发表评论但这不起作用,但我想我已经弄明白了。谢谢!
答案 2 :(得分:0)
我有一个解决方案,我随着时间的推移想出来(抱歉,我有一段时间没有检查过)
checkIt <- function(bind) {
print(bind)
cmpfun <- function(r) {all(r == heeds.data[bind,23:47,drop=FALSE])}
brows <- apply(heeds.data[,23:47], 1, cmpfun)
#print(heeds.data[brows,c("eval.num","fitness","green.h.1","green.h.2","green.v.5")])
print(nrow(heeds.data[brows,c("eval.num","fitness","green.h.1","green.h.2","green.v.5")]))
}
请注意,heeds.data是我的实际数据框架,我最初打印了几列以确保它正常工作(现已注释掉)。此外,23:47是需要检查重复的部分
另外,我真的没有学到如此多的R,所以我愿意接受建议。
希望这有帮助!