在 R 中分配键值对

Assigning Key Value Pairs in R

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

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

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

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  
}

这个 returns 一个长度为 1 的列表,条目 10

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

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

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

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

在很多情况下,在 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

使用 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