如何在R中制作元组或字典的列表

How to make a list of tuples or dictionary in R

提问人:guy404 提问时间:11/10/2023 更新时间:11/10/2023 访问量:53

问:

我在 python 编程方面有一点经验,但刚刚开始了每台计算机上都有 R 的工作,我需要至少使用它一段时间,直到我对 python 的请求通过系统工作。我正在尝试编写一段代码来遍历类别和该类别中的项目。

我的第一次尝试是这样的:

`my_list <- list(('fruit', ('apple', 'banana', 'orange')), ('vegetables', ('carrot', 'leek', 'cabbage')))
                
                
for (category in my_list) {
  print(category[1])
  for (item in category[2]) {
    print(item)
  }
}`

我的结果是: my_list错误:找不到对象“my_list”

我希望它打印类别(水果和蔬菜),然后是该类别中的项目。

除了很难找到创建元组列表的简单答案(我想我发现 R 中不存在字典)之外,我真的很困惑为什么程序找不到my_list。

作为参考,等效的 python 代码为: a)

`my_dict = {'fruit': ('apple', 'banana', 'orange'),
           'vegetables': ('carrot', 'leek', 'cabbage')}

for k in my_dict:
    print(k)
    
    for item in my_dict[k]:
        print item
`

或 b)

`my_list = [('fruit', ('apple', 'banana', 'orange')),
           ('vegetables', ('carrot', 'leek', 'cabbage'))]


for category in my_list:
    print(category[0])
    
    for item in category[1]:
        print(item)`
R 字典 元组

评论

2赞 MrFlick 11/10/2023
您有语法错误。R 不用于元组文字。它使用该函数创建向量。向量不能嵌套,但列表可以。所以你想要类似的东西,或者可能只是一个命名列表:my_list()c()my_list <- list(list('fruit', c('apple', 'banana', 'orange')), list('vegetables', c('carrot', 'leek', 'cabbage')))my_list <- list(fruit=c('apple', 'banana', 'orange'), vegetables= c('carrot', 'leek', 'cabbage'))
0赞 guy404 11/10/2023
我现在正在运行它。起初尝试这样做,但该片段是更大程序的一部分。我很感激你的帮助。我不知道这是否超出了这里的范围,但是如果在创建my_list时出现错误,为什么没有抛出错误?程序继续进行,直到进入循环。
0赞 MrFlick 11/10/2023
我不知道为什么你没有收到错误。如果我复制您的并将其粘贴到 R 中,我会得到一个错误,上面写着 .你究竟是如何运行这段代码的?也许你只是没有看到错误,更早的错误。R 不一定在出现第一个错误时停止运行。my_list <-Error: unexpected ',' in "my_list <- list(('fruit',"

答:

1赞 G. Grothendieck 11/10/2023 #1

您可能希望像这样定义为字符向量的命名列表,我们将使用此定义。(最后,我们展示了如何转换为这种形式。my_list

my_list <- list(
 fruit = c('apple', 'banana', 'orange'),
 vegetables = c('carrot', 'leek', 'cabbage')
)

在这种情况下,此代码有效:

for(category in names(my_list)) {
  cat(category, "\n")
  for(item in my_list[[category]])
    cat("-", item, "\n")
}
## fruit 
## - apple 
## - banana 
## - orange 
## vegetables 
## - carrot 
## - leek 
## - cabbage 

事实上,根据你想要的内容,只需使用或将其键入到 R 控制台中即可打印它,如下所示:print(my_list)

my_list
## $fruit
## [1] "apple"  "banana" "orange"
##
## $vegetables
## [1] "carrot"  "leek"    "cabbage"

如果您已经在下面,则可以将其转换为与此答案顶部相同的列表。my_list2my_list3my_list

my_list2 <- list(
  c('fruit', 'apple', 'banana', 'orange'), 
  c('vegetables', 'carrot', 'leek', 'cabbage')
)

my_list3 <- lapply(my_list2, "[", -1)
names(my_list3) <- sapply(my_list2, "[[", 1)

identical(my_list, my_list3)
## [1] TRUE