在 R 中的循环中使用索引

Using Indices Within Loops in R

当我从工作目录读入数据时,我想根据条件(每个文件中是否存在数据)更改循环内的索引。我处理的数据是一个字符串,因此我使用 grepgreplregexprregmatches。出于示例目的,我将其简化,假设我有两个名为“a”和“b”的 txt 文件:

> a
   V1          V2
1   x           y
2   a 0.833223959
3   b 0.091844199
4   a 0.621608435
5   b 0.777329289
6   a 0.751375338
7   b 0.901111344
8   c  0.21334871
9   a 0.497397497
10  b 0.411770909
11  a 0.231413906
12  b 0.784392324

> b
   V1          V2
1   x           y
2   a 0.599759758
3   b 0.749867176
4   a 0.903613002
5   b 0.463056008
6   a 0.180150744
7   b 0.046976206
8   a 0.209595667
9   b 0.260654739
10  a 0.462145366
11  b 0.707365526
12  b  0.98813125

我将它们存储在一个目录中,并希望使用以下方法将它们作为字符串批量读取:

txtfiles = list.files(pattern="^[^.].*\.txt$")

然后我想 select 在“a”之后第 3 次出现的数值,但数据文件中有“c”的地方除外——在这种情况下,我想select 第 4 次出现后的数值。我的第一个想法是用字母而不是数字来包含索引,即 [d] 而不是 [3],它在以下位置工作:

txtfiles = list.files(pattern="^[^.].*\.txt$")
d<-3
for (i in 1:length(txtfiles)){
    all_data <- readLines(txtfiles[i])
    temp <- all_data[a2 <- grep("a",all_data)] [d]
    a1[i] <- regmatches(temp, regexpr("[0-9]{1,9}.[0-9]{1,9}",temp))

}

当我想根据文件中“c”的出现更改 d 的值时,它似乎可以工作:

for (i in 1:length(txtfiles)){
all_data <- readLines(txtfiles[i])
temp <- any(grepl("c", all_data))
d[i] <- ifelse(temp, '4', '3')

}

> d
[1] "4" "3"

但是放在循环里,用objective改变“d”的值,好像不行:

for (i in 1:length(txtfiles)){
    temp <- any(grepl("c", all_data))
    d[i] = ifelse(temp, '4', '3')
    all_data <- readLines(txtfiles[i])
    temp <- all_data[a2 <- grep("a",all_data)] [d[i]]
    a1[i] <- regmatches(temp, regexpr("[0-9]{1,9}.[0-9]{1,9}",temp))

}

> a1
NULL

感谢您的帮助!

我找到了解决方法:

if (temp==FALSE)
{ d <- 3 

} else
{ d<-4 
}

是必需的,而不是:

d[i] = ifelse(temp, '4', '3')

这是因为上面得到了所有情况下 d 的所有排列的列表。事实上,我需要 d 随循环的每个 运行 改变,以便索引随每个文件而改变。

此外,d 不需要 [i]