【问题标题】:Assigning Key Value Pairs in R在 R 中分配键值对
【发布时间】:2021-10-26 13:18:48
【问题描述】:

我对如何使用 R 中的列表分配键值对感到困惑。

我有一个包含多行多列的数据框。我有一个 ID 列和另一个名为 price 的列,

我想创建一个循环遍历我的 ID 列的 for 循环,并使用 ID 列的元素作为 key 和 price 列的元素作为 value

id <- seq(1,10,1)
price <- abs(rnorm(10))
x1 <- seq(100,1000,100)

data <- data.frame(x1, price, id)

for (i in data$id){
  for (y in data$price){
    value = y
}
key = i
  alist = list()
  alist[[key]] = value  
}

这将返回一个长度为 1 的列表,其中包含条目 10

显然我的 R 编程概念是错误的,因此它不起作用。因此,如果有人可以澄清我做错了什么,那就太好了!数据很琐碎,我的实际数据基本相同,只是多了很多列,但我只想关注这两列。

附带说明,如果您有很多行,for 循环会变得非常慢,所以如果有人知道如何以更有效的方式执行此操作,请赐教。谢谢!

【问题讨论】:

  • 您的代码中的问题是您在外循环的每次迭代中将alist 替换为一个空列表。您需要在两个循环之外初始化此列表。另外,alist &lt;- split(price, id) 会直接给你结果。
  • 啊,谢谢你的澄清!我需要回去了解循环是如何工作的。我也会尝试 split() 函数

标签: r for-loop nested-loops


【解决方案1】:

在许多情况下,在 R 中不需要循环。 应该吗?

> set.seed(42)
> 
> id <- seq(1,10,1)
> price <- abs(rnorm(10))
> x1 <- seq(100,1000,100)
> data <- data.frame(x1, price, id)
> 
> setNames(as.list(data$price),data$id)
$`1`
[1] 1.370958

$`2`
[1] 0.5646982

$`3`
[1] 0.3631284

$`4`
[1] 0.6328626

$`5`
[1] 0.4042683

$`6`
[1] 0.1061245

$`7`
[1] 1.511522

$`8`
[1] 0.09465904

$`9`
[1] 2.018424

$`10`
[1] 0.0627141

【讨论】:

    【解决方案2】:

    使用tibble::deframe() 的选项。

    library(tibble)
    
    as.list(deframe(data[c('id', 'price')]))
      
    # $`1`
    # [1] 0.16755
    # 
    # $`2`
    # [1] 0.7488444
    # 
    # $`3`
    # [1] 0.5633155
    # 
    # $`4`
    # [1] 0.5785397
    # 
    # $`5`
    # [1] 2.016018
    # 
    # $`6`
    # [1] 0.4830829
    # 
    # $`7`
    # [1] 0.8575976
    # 
    # $`8`
    # [1] 0.8113425
    # 
    # $`9`
    # [1] 0.4937693
    # 
    # $`10`
    # [1] 1.044266
    

    【讨论】:

    • 这个方法在我试过的所有方法中最适合我,谢谢你也让我知道 deframe 功能!
    【解决方案3】:

    如果你要循环,而且你可能不需要,你只需要一个循环。

    alist = list()
    
    for (i in data$id){
      key = i
      
      alist[[key]] = data[[key, 'price']]
    }
    
    alist
    
    Sample Output
    
    [[1]]
    [1] 0.6174008
    
    [[2]]
    [1] 1.354075
    
    [[3]]
    [1] 1.17742
    
    [[4]]
    [1] 0.8964335
    
    [[5]]
    [1] 1.577932
    
    [[6]]
    [1] 1.29356
    
    [[7]]
    [1] 0.7557945
    
    [[8]]
    [1] 0.7060919
    
    [[9]]
    [1] 0.1324002
    
    [[10]]
    [1] 1.022202
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多