我在R上有一个数据框,我想删除那些在B列中没有连续增加的行。我的意思是,每行中的值必须高于前一行但低于下一个。我不想根据B列对数据框进行排序,因为我想保留A列中的顺序。我想我可以用if语句执行此操作,但我没有足够的R经验,谢谢高级。
我拥有的是这个,我必须删除已加星标的值。
int temp[] = { 0, (static_cast<Mixins*>(this)->GoImpl(), 0)... };
我需要这个:
A B
26.00 11158115
27.00 16722714*
27.08 11881252
90.25 69428973
90.27 69749777
93.30 64207240*
95.90 71428751
96.00 71670964
107.65 100385980
107.75 226164158*
107.8 103280320
答案 0 :(得分:0)
这是一个解决方案,有点像:
A <- c(26.00, 27.00, 27.08, 90.25, 90.27, 93.30, 95.90, 96.00, 107.65, 107.75, 107.8)
B <- c(11158115, 16722714, 11881252, 69428973, 69749777, 64207240, 71428751, 71670964, 100385980,
226164158, 103280320)
d <- data.frame(A, B)
repeat {
delta <- diff(d$B)
# delta gives you the difference between successive values of B
# delta[1] corresponds to the difference between B[2] and B[1]
if(all(delta > 0)) {
break
}
iWrong <- 1 + which(delta < 0)
# '1 +' means that if the next value is not larger than the previous value
# (delta is not positive), we delete the next value
# you can remove '1+' and delete this value instead
d <- d[-iWrong,]
}
我说&#34;有点&#34;因为我不清楚哪些行应该被删除。为什么要删除第2行而不是第3行?两者都会给你增加B值。通过我的解决方案,你将得到:
1 26.00 11158115
2 27.00 16722714
4 90.25 69428973
5 90.27 69749777
7 95.90 71428751
8 96.00 71670964
9 107.65 100385980
10 107.75 226164158
答案 1 :(得分:0)
我找不到更好的解决方案,但至少它有效。
df = read.table(text = "A,B
26.00,11158115
27.00,16722714
27.08,11881252
90.25,69428973
90.27,69749777
93.30,64207240
95.90,71428751
96.00,71670964
107.65,100385980
107.75,226164158
107.8,103280320", header = TRUE, sep = ",", stringsAsFactors = FALSE)
r = 2
repeat {
if ((df$B[r] < df$B[r-1] | df$B[r] > df$B[r+1]) & df$B[r-1] < df$B[r+1]) {
df <- df[-r,]
} else {
r = r + 1
}
if (r == nrow(df)) break
}
df
输出:
A B
1 26.00 11158115
3 27.08 11881252
4 90.25 69428973
5 90.27 69749777
7 95.90 71428751
8 96.00 71670964
9 107.65 100385980
11 107.80 103280320
说明:
我们从第二个元素遍历数据框的每一行(第一个元素始终对第一个元素有效)。然后,我们使用预期标准删除每一行:该值必须高于前一行并且低于下一行((B[r] < B[r-1] or B[r] > B[r+1]))
。但是使用此条件我们无法获得预期结果,因此我们也验证了后续值高于前一个值(B[r-1] < df$B[r+1]
)