R - 使用 for 循环和内置 LETTERS 附加到名称为 l_A、l_B、l_C ... 等的列表
R - Appending to lists with names l_A, l_B, l_C ... etc. using for loops and built-in LETTERS
我生成了对应于字母表中每个字母的空列表。列表的名称采用 l_A, l_B
, ...
我还有一个用字符串填充的单列数据框(全部小写,无符号)。我想将这些字符串按首字母排序到相应的列表中,例如,单词“aardvark”将进入列表 l_A
.
我在遍历数据框时无法调用正确的列表。这是我尝试使用 for 循环进行排序。例如,我使用了使用库“OpenRepGrid”构建的随机单词列表(全部小写)来构建起始数据框。
install.packages("OpenRepGrid")
library(OpenRepGrid)
# random words data frame
df <- data.frame(tolower(randomWords(100)))
# lists for each letter
for (i in 1:26){
nam <- paste0("l_", LETTERS[i])
assign(nam, list())
}
# sorting words in data frame into lists using for loops
for (i in 1:nrow(df)){
for (j in 1:26){
if (substr(df[i, 1], 1, 1) == letters[j]){
append(eval(as.name(paste0("l_", LETTERS[j]))), df[i, 1])
}
}
}
空列表生成正确,我没有收到任何错误,但我的所有列表最终仍然是空的。这让我认为问题在于尝试使用 eval(as.name(paste0("l_", LETTERS[j])))
调用列表。我知道我可以为每个列表编写 if 语句而不是使用嵌套的 for 循环,但这对于 26 个列表来说很麻烦!
即使你有更优雅的方法,我仍然想知道我需要做什么才能使我当前的方法工作以及你自己推荐的解决方案。
TIA!
OP 正在循环中创建 NULL list
。它也可以通过更简单的方式完成
> l_A
list()
在第二个循环中,我们需要get
为append
ing和assign
创建的list
的值返回到同一个对象
for (i in 1:nrow(df)){
for (j in 1:26){
if (substr(df[i, 1], 1, 1) == letters[j]){
tmp <- paste0("l_", LETTERS[j])
assign(tmp, append(get(tmp), df[i, 1]))
}
}
}
-正在检查
> l_A
[[1]]
[1] "as"
[[2]]
[1] "airplane"
[[3]]
[1] "as"
[[4]]
[1] "away"
[[5]]
[1] "airplane"
[[6]]
[1] "airplane"
...
我生成了对应于字母表中每个字母的空列表。列表的名称采用 l_A, l_B
, ...
我还有一个用字符串填充的单列数据框(全部小写,无符号)。我想将这些字符串按首字母排序到相应的列表中,例如,单词“aardvark”将进入列表 l_A
.
我在遍历数据框时无法调用正确的列表。这是我尝试使用 for 循环进行排序。例如,我使用了使用库“OpenRepGrid”构建的随机单词列表(全部小写)来构建起始数据框。
install.packages("OpenRepGrid")
library(OpenRepGrid)
# random words data frame
df <- data.frame(tolower(randomWords(100)))
# lists for each letter
for (i in 1:26){
nam <- paste0("l_", LETTERS[i])
assign(nam, list())
}
# sorting words in data frame into lists using for loops
for (i in 1:nrow(df)){
for (j in 1:26){
if (substr(df[i, 1], 1, 1) == letters[j]){
append(eval(as.name(paste0("l_", LETTERS[j]))), df[i, 1])
}
}
}
空列表生成正确,我没有收到任何错误,但我的所有列表最终仍然是空的。这让我认为问题在于尝试使用 eval(as.name(paste0("l_", LETTERS[j])))
调用列表。我知道我可以为每个列表编写 if 语句而不是使用嵌套的 for 循环,但这对于 26 个列表来说很麻烦!
即使你有更优雅的方法,我仍然想知道我需要做什么才能使我当前的方法工作以及你自己推荐的解决方案。
TIA!
OP 正在循环中创建 NULL list
。它也可以通过更简单的方式完成
> l_A
list()
在第二个循环中,我们需要get
为append
ing和assign
创建的list
的值返回到同一个对象
for (i in 1:nrow(df)){
for (j in 1:26){
if (substr(df[i, 1], 1, 1) == letters[j]){
tmp <- paste0("l_", LETTERS[j])
assign(tmp, append(get(tmp), df[i, 1]))
}
}
}
-正在检查
> l_A
[[1]]
[1] "as"
[[2]]
[1] "airplane"
[[3]]
[1] "as"
[[4]]
[1] "away"
[[5]]
[1] "airplane"
[[6]]
[1] "airplane"
...