3

私の質問は、処理するファイルが数百あるため、測定データの自動フィルタリングについてです。ファイル構造は次のようになります。

test1 <- read.table("~/test1.txt",sep="\t",dec=".",skip=17,header=TRUE)

Number  Time.s      Potential.V Current.A
1       0.0000      0.060       -0.7653
2       0.0285      0.060       -0.7597
3       0.0855      0.060       -0.7549
.....
17      0.8835      0.060       -0.7045
18      0.9405      0.060       -0.5983
19      0.9975      0.061       -0.1370
20      1.0545      0.062        0.1295
21      1.1115      0.063        0.2680
......
8013    456.6555    0.066       -1.1070
8014    456.7125    0.065       -1.1850
8015    456.7695    0.063       -1.2610
8016    456.8265    0.062       -1.3460
8017    456.8835    0.061       -1.4380
8018    456.9405    0.060       -1.4350
8019    456.9975    0.060       -1.0720
8020    457.0545    0.060       -0.8823
8021    457.1115    0.060       -0.7917
8022    457.1685    0.060       -0.7481

Potential.V == 0.06 を使用して、最初と最後の余分な行を取り除く必要があります。私の問題は、さまざまなファイルの最初と最後の行数が固定されていないことです。

次の制限は、ファイルに複数の測定値が次々に含まれていることです。そのため、data.frame の 0.06 を含むすべての行を単純に削除することはできません。

私は手動でカットを行った瞬間、あまりエレガントではありませんが、より良い解決策を知りません:

test_b1 <- data.frame(test1$Number[18:8018],test1$Time.s[18:8018],test1$Potential.V[18:8018],test1$Current.A[18:8018])

次のような反復を使用してみました

for (c in 1:(length(test1))) {
    if (counter>1) & ((as.numeric(r[counter])- as.numeric(r[counter-1]))==1) {
       cat("Skip \n")}
}

しかし、私の側のスキルが不足しているため、実用的な解決策はありませんでした:/ .

CRAN にモジュールがありますか、またはそのような問題を解決するためのより洗練された方法はありますか?

よろしくお願いします

4

3 に答える 3

2

を使用したものを次に示しrleます。

filter.df <- function(df) {
    pot.rle <- rle(df$Potential.V)
    idx <- cumsum(pot.rle$lengths)
    val <- pot.rle$values
    chk <- ifelse(val[1] == 0.06 & val[length(val)] == 0.06, TRUE, FALSE)
    if (chk) {
        df[(idx[1]):(max(idx[1], idx[length(idx)-1])+1), ]
    }
}
filter.df(df)

#    Number   Time.s Potential.V Current.A
# 5      18   0.9405       0.060   -0.5983
# 6      19   0.9975       0.061   -0.1370
# 7      20   1.0545       0.062    0.1295
# 8      21   1.1115       0.063    0.2680
# 9    8013 456.6555       0.066   -1.1070
# 10   8014 456.7125       0.065   -1.1850
# 11   8015 456.7695       0.063   -1.2610
# 12   8016 456.8265       0.062   -1.3460
# 13   8017 456.8835       0.061   -1.4380
# 14   8018 456.9405       0.060   -1.4350
于 2013-05-17T13:55:34.570 に答える
2

を使用する別の方法which.max

# data modified to include 0.06 Potential.V in inner range
d <- read.table(text="Number  Time.s      Potential.V Current.A
1       0.0000      0.060       -0.7653
2       0.0285      0.060       -0.7597
3       0.0855      0.060       -0.7549
17      0.8835      0.060       -0.7045
18      0.9405      0.060       -0.5983
19      0.9975      0.061       -0.1370
19      0.9975      0.060       -0.1370
20      1.0545      0.062        0.1295
21      1.1115      0.063        0.2680
8013    456.6555    0.066       -1.1070
8014    456.7125    0.065       -1.1850
8015    456.7695    0.063       -1.2610
8016    456.8265    0.062       -1.3460
8017    456.8835    0.061       -1.4380
8018    456.9405    0.060       -1.4350
8019    456.9975    0.060       -1.0720
8020    457.0545    0.060       -0.8823
8021    457.1115    0.060       -0.7917
8022    457.1685    0.060       -0.7481", header=TRUE)

with(d, {
    inner.start <- which.max(Potential.V != 0.06)
    inner.end <- nrow(d) - which.max(rev(Potential.V != .06)) + 1
    d[inner.start:inner.end, ]
})

#    Number   Time.s Potential.V Current.A
# 6      19   0.9975       0.061   -0.1370
# 7      19   0.9975       0.060   -0.1370
# 8      20   1.0545       0.062    0.1295
# 9      21   1.1115       0.063    0.2680
# 10   8013 456.6555       0.066   -1.1070
# 11   8014 456.7125       0.065   -1.1850
# 12   8015 456.7695       0.063   -1.2610
# 13   8016 456.8265       0.062   -1.3460
# 14   8017 456.8835       0.061   -1.4380

内側の範囲の前後に 0.06 行を含めたい場合は、 から 1 を引き、inner.startに 1 を足しinner.endます。

于 2013-05-17T14:09:37.817 に答える