簡體   English   中英

R:從 dataframe 為字符行賦值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM