【问题标题】:RLang: accessing list items via chaining and map (purrr)RLang:通过链接和映射访问列表项(purrr)
【发布时间】:2021-04-18 05:01:42
【问题描述】:

几年后我再次尝试 R,更习惯于 Python dicts 或 Kotlin 映射或 JS 对象。我只是在使用一些链接方法后尝试访问键值对的值。不幸的是,普通的访问器 $[[ 没有返回预期值,或者抛出错误。

知道如何从我的示例代码中简单地获取正确的州名(“阿拉巴马州”、“加利福尼亚州”、“亚利桑那州”)列表吗?谢谢。

states_list <- list("AL"="Alabama", "AK"="Alaska", "AZ"="Arizona", "CA"="California")  # (etc)
states_hash <- hash("AL"="Alabama", "AK"="Alaska", "AZ"="Arizona", "CA"="California")  # (etc)

"AL-CA-AZ" %>% str_split("-") %>% map(~ states_list$.x)  # NULL 
"AL-CA-AZ" %>% str_split("-") %>% map(~ states_list[.x]) # k-v pairs, not just the values

"AL-CA-AZ" %>% str_split("-") %>% map(~ states_hash$.x)  # NULL 
"AL-CA-AZ" %>% str_split("-") %>% map(~ has.key(.x, states_hash)) # AL:TRUE CA:TRUE AZ:TRUE 
"AL-CA-AZ" %>% str_split("-") %>% map(~ states_hash[.x]) # k-v pairs, not just the values

"AL-CA-AZ" %>% str_split("-") %>% map(~ states_list[[.x]]) # error - "recursive indexing failed at level 2"
"AL-CA-AZ" %>% str_split("-") %>% map(~ states_hash[[.x]]) # error - "wrong arguments for subsetting an environment"

"AL-CA-AZ" %>% str_split("-") %>% states_list[[.x]] # error - "object '.x' not found"

【问题讨论】:

    标签: r purrr method-chaining


    【解决方案1】:

    您的问题实际上是str_split 步骤。请注意,str_split 将返回一个列表,而不是一个向量。 (这样做是因为您可以一次将多个字符串传递给函数,并且它将所有结果在列表中分开。)因此,当您在该列表上 map 时,您只是映射到单个列表,而不是每个列表列表中向量中的三个元素。一种有点笨拙的改变方式是

    "AL-CA-AZ" %>% {str_split(., "-")[[1]]} %>% map(~states_list[[.x]])
    

    你可以用purrr:pluck清理一下

    "AL-CA-AZ" %>% str_split("-") %>% pluck(1) %>% map(~states_list %>% pluck(.x))
    

    或者直接为最后一步做索引

    "AL-CA-AZ" %>% str_split("-") %>% pluck(1) %>% {states_list[.]}
    

    【讨论】:

    • 感谢您的快速回复。想象一下列表值是数字,而不是字符串,最后我想 SUM() 。我目前收到错误invalid 'type' (list) of argument...如何将结果转换为向量(或任何可以求和的数据类型)?另外,你能解释一下大括号的作用,或者让我参考一些文档吗?
    • 如果您需要数字,请使用map_dbl 来获取数字向量,而不是通用的map。花括号只是创建一个代码块。它们可以影响管道的行为方式。见magrittr.tidyverse.org
    • 再次感谢您。我尝试以最小的开销提交一个问题,以获得最简单的重现性。不幸的是,这似乎不适用于数据框 mutate(),因为 pluck() 会抛出 must be size 133650 or 1, not 3 。与第一个示例相同,使用 [[1]]。如果我跳过 pluck() 而只是做 map(~states_list[[.x]]) 它会抛出 recursive indexing failed at level 2
    • 如果它在 data.frame 中,听起来您可能应该进行某种类型的连接。最好提出一个更能代表您正在尝试做的事情的新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多