【问题标题】:R - Appending to lists with names l_A, l_B, l_C ... etc. using for loops and built-in LETTERSR - 使用 for 循环和内置 LETTERS 附加到名称为 l_A、l_B、l_C ... 等的列表
【发布时间】:2022-01-26 00:10:45
【问题描述】:

我已经生成了与字母表中的每个字母相对应的空列表。列表的名称采用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!

【问题讨论】:

    标签: r for-loop append eval variable-names


    【解决方案1】:

    OP 正在循环中创建 NULL list。它也可以通过更简单的方式完成

    > l_A
    list()
    

    在第二个循环中,我们需要将getappending和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"
    ...
    

    【讨论】:

    • 成功了,谢谢。我将如何遍历列表以将最长列表的长度作为值分配给变量“max”?例如。如果最长的列表有 12 个单词,“max”将等于 12
    • @DeeG 不清楚。你是说max(lengths(mget(paste0("l_", LETTERS))))# [1] 18
    • 如果我有字符向量(称为v_Av_B 等)而不是列表,如何将这些向量的长度设置为与max(lengths(mget(paste0("v_", LETTERS)))) 相同?
    • @DeeG 相同的代码应该可以工作,即v_A &lt;- 1:5; v_B &lt;- 6:11; max(lengths(mget(paste0("v_", LETTERS[1:2]))))# [1] 6
    • 代码有效,但我不知道如何使用该代码并将所有向量的长度设置为最大长度,而无需为每个向量手动执行
    猜你喜欢
    • 2022-01-20
    • 2017-05-13
    • 2014-01-11
    • 2016-05-13
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2020-03-02
    相关资源
    最近更新 更多