2013-05-17 31 views
3

我的问题是关于测量数据的自动过滤,因为我有几百个文件需要处理。 的文件结构如下:R内测量数据自动过滤

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中的所有行。

我的那一刻我做手工切割,不是很优雅,但我不知道一个更好的解决方案:

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上是否有一个模块或更好的方法来解决这些问题?

问候

+0

**非常感谢您的回答** 全部击溃制定出来,帮了我很多在更好地理解R. 问候IInatas – IInatas

回答

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 
+1

的它应该是'|'的'而不是&'? – juba

+0

juba,我认为这取决于OP是否希望只在开始和结束时都存在0.06时才删除。这至少对我来说并不明显...... – Arun

+0

非常感谢您的解决方案和意见 – IInatas

2

这里的一个又一个,颇为相似,也与rle

val <- rle(df$Potential.V) 
if (val$values[1]==0.06) df <- df[-(1:(val$lengths[1]-1)),] 
if (tail(val$values,1)==0.06) { 
    nb <- nrow(df) 
    df <- df[-((nb-tail(val$lengths,1)+2):nb),] 
} 

它提供:

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 
+1

只需编辑以保留最后的第一个和最后的第一个...... – juba

+0

非常感谢您的解决方案和意见该解决方案运行良好,并帮助我更好地理解R的运行方式。 – IInatas

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 

如果你只想和前内侧范围后,从inner.start减1加1到inner.end包括0.06一行。 !

+0

非常感谢您的解决方案,它对我的​​数据工作正常。 – IInatas

+0

@Iatatas很棒。不要忘记接受你随行的答案。 –