在 R 中的循环中使用索引
Using Indices Within Loops in R
当我从工作目录读入数据时,我想根据条件(每个文件中是否存在数据)更改循环内的索引。我处理的数据是一个字符串,因此我使用 grep
、grepl
、regexpr
和 regmatches
。出于示例目的,我将其简化,假设我有两个名为“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]
。
当我从工作目录读入数据时,我想根据条件(每个文件中是否存在数据)更改循环内的索引。我处理的数据是一个字符串,因此我使用 grep
、grepl
、regexpr
和 regmatches
。出于示例目的,我将其简化,假设我有两个名为“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]
。