在 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
我对如何使用 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