[英]R: Assign value to a character row from dataframe
嗨,我如何為基於第二列的第一列字符賦值。 請參閱下面的示例 dataframe。
> Code <- c('A','B','C','D','E')
> Value <- c(1.23,1.4,1.55,1.67,1.3)
> ds <- data.frame(Code, Value)
> ds
Code Value
1 A 1.23
2 B 1.40
3 C 1.55
4 D 1.67
5 E 1.30
例如,當我在 R 控制台中鍵入“A”時,它的值應該是 1.23。 沒有錯誤如下圖。
> A
Error: object 'A' not found
所需的 output 是。
> A
[1] 1.23
它也應該在代碼 B 到 E 中工作。
不建議使用許多全局變量,但是,這是一種方法:
list2env(split(ds$Value, ds$Code), .GlobalEnv)
A
#[1] 1.23
B
#[1] 1.4
還有另一種方式,這里使用assign()
和for
循環:
for(i in seq_len(nrow(ds))) {
assign(ds$Code[i], ds$Value[i])
}
另一個使用setNames
+ list2env
基本 R 選項
list2env(with(ds, setNames(as.list(Value), Code)), .GlobalEnv)
或eval
+ str2expression
(不推薦使用此選項)
eval(str2expression(do.call(paste, c(ds, sep = "<-", collapse = ";"))))
不完全符合您的要求(我不會將所有行添加為全局變量)。 相反,此解決方案將您的data.frame
保留為data.table
並帶有一個鍵,可讓您以簡潔的方式檢索相關行:
library(data.table)
setDT(ds)
setkey(ds, Code)
ds["B", Value]
# [1] 1.4
您還可以使用命名列表:
x <- setNames(as.list(ds$Value), ds$Code)
x$B
# [1] 1.4
您可以使用attach
來訪問命名列表的值。
attach(setNames(as.list(ds$Value), ds$Code))
A
#[1] 1.23
D
#[1] 1.67
#And remove it again with
detach()
或者你可以在mapply
中使用assign
mapply(assign, ds$Code, ds$Value, MoreArgs = list(envir = .GlobalEnv))
或使用Vectorize
Vectorize(assign, c("x", "value"))(ds$Code, ds$Value, envir = .GlobalEnv)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.