【问题标题】:Returning key/value using R "dictionary"使用 R“字典”返回键/值
【发布时间】:2014-08-26 22:16:15
【问题描述】:

依靠the thread here,我把R“字典”做成如下:

boxes_sent <- vector(mode="list", length=4)
boxes_sent <- c("NE01", "NE02", "NE03", "NE04")
names(boxes_sent) <- c(seq(1:4))

boxes_rcvd <- vector(mode="list", length=4)
boxes_rcvd <- c("NW01", "NW02", "NW03", "NW04")
names(boxes_rcvd) <- c(seq(from = 13, to =16))

boxes_all <- c(boxes_rcvd, boxes_sent)

> boxes_all
13     14     15     16      1      2      3      4 
"NW01" "NW02" "NW03" "NW04" "NE01" "NE02" "NE03" "NE04"

调用names(boxes_all)[[1]] 返回“13”,而boxes_all[[1]] 返回“NW01”,两者都对应于列表中的第一项。但是,我认为这会根据我在执行names(boxes_sent) &lt;- c(seq(1:4)) 时建立的键/值对返回“NE01”。如何修改以便调用names(boxes_all)[[1]] 返回“NE02”?在我的数据集中,我有 39 个用于字典的键/值对。

我想使用names() 来执行此操作,尽管我尝试了the thread here 中建议的环境但没有成功:

boxes_sent<-new.env()
boxes_sent[["NE01", "NE02", "NE03", "NE04"]]<-c(seq(1:4))
boxes_rcvd <- new.env()
boxes_rcvd[["NW01", "NW02", "NW03", "NW04"]]<-c(seq(from = 13, to =16))

Error in boxes_sent[[c("NE01", "NE02", "NE03", "NE04")]] <- c(seq(1:4)) : 
  wrong args for environment subassignment

感谢您的时间和关注。

R 版本 3.0.3

【问题讨论】:

  • 你试过ordersort吗?也许,我误解了这个问题。 box_all1

标签: r dictionary hash environment


【解决方案1】:

第一件事:你不需要在 R 中指定变量类型。所以当你有这样的代码时:

boxes_sent <- vector(mode="list", length=4)
boxes_sent <- c("NE01", "NE02", "NE03", "NE04")

您将boxes_sent 定义为一个列表,然后将其重新定义为一个字符向量。所以第一行是浪费时间。

其次,c(seq(1:4)) 是三重矫枉过正。 1:4 为您提供从一到四的数字序列,返回一个整数向量。与调用seq(1, 4)c(1, 2, 3, 4) 相同。这里不需要全部三个。

第三,当您为向量分配名称时,请注意这些名称存储为字符向量。 (这正是您想要的类似字典的行为。)请注意

names(boxes_sent)
## [1] "1" "2" "3" "4"

第四,如果您想将向量用作字典,那么您使用的索引类型错误。字典的全部意义在于您将字符串作为索引(“键”)传递,然后返回值。

所以在这种情况下,您的键是字符串“1”、“2”、“3”、“4”、“13”、“14”、“15”、“16”。因此,要检索值“NE02”,您需要传入键“2”。也就是说,输入boxes_all["2"]

第五,搞乱环境是一个高级主题。您几乎不需要显式使用它们。对于字典行为,如果您的所有值都是字符串,则使用字符向量。如果值具有不同的大小或类型,则使用列表。

【讨论】:

  • 这是无价之宝!在我更大的数据集中,我使用循环和toString() 来遍历我的数据框,将每个索引转换为字符串并返回正确的值。
  • 如果有人能指出如何使用环境来实现这一点,那将是一个额外的学习。谢谢。
猜你喜欢
  • 2012-12-08
  • 2023-02-14
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多