亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

`levels <-`(這是什么法術?

`levels <-`(這是什么法術?

ABOUTYOU 2019-10-06 12:55:47
在回答另一個問題時,@ Marek發布了以下解決方案:https ://stackoverflow.com/a/10432263/636656dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,                                   7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")`levels<-`(  factor(dat$product),  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)  )產生的輸出: [1] Generic Generic Bayer   Bayer   Advil   Tylenol Generic Advil   Bayer   Generic Advil   Generic Advil   Tylenol[15] Generic Bayer   Generic Advil   Bayer   Bayer  這只是矢量的打印輸出,因此要存儲它,您可能會更加困惑:res <- `levels<-`(  factor(dat$product),  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)  )顯然,這是對level函數的某種調用,但是我不知道在這里正在做什么。這種巫術的術語是什么,我如何在這方面增加我的魔法能力?
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

這里的答案是好的,但是它們缺少重要的一點。讓我嘗試描述一下。


R是一種功能語言,不喜歡對其對象進行突變。但是它確實允許使用替換函數進行賦值語句:


levels(x) <- y

相當于


x <- `levels<-`(x, y)

訣竅是,這種重寫是由<-; 完成的。它不是由levels<-。levels<-只是一個接受輸入并給出輸出的常規函數;它不會改變任何東西。


結果之一是,根據上述規則,<-必須是遞歸的:


levels(factor(x)) <- y


factor(x) <- `levels<-`(factor(x), y)


x <- `factor<-`(x, `levels<-`(factor(x), y))

這種純功能的轉換(直到最后,發生賦值)等同于一種命令式語言中的賦值,這是一種美麗。如果我沒記錯的話,這種用功能語言構造的鏡頭稱為鏡頭。


但是,一旦您定義了諸如的替換函數levels<-,您將獲得另一個意想不到的意外收獲:您不僅具有進行分配的能力,還擁有一個方便的函數,該函數吸收了一個因數,并給出了另一個具有不同級別的因數。確實沒有任何“分配”!


因此,您所描述的代碼只是利用的另一種解釋levels<-。我承認這個名稱levels<-有點令人困惑,因為它暗示了一項任務,但是事實并非如此。該代碼只是建立了一種管道:


從...開始 dat$product


將其轉換為因子


改變水平


存放在 res


我個人認為代碼行很漂亮;)


查看完整回答
反對 回復 2019-10-06
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

沒有法寶,這就是(子)分配功能的定義方式。  levels<-有所不同,因為它是(子)分配因子屬性而不是元素本身的原始函數。有很多此類函數的示例:


`<-`              # assignment

`[<-`             # sub-assignment

`[<-.data.frame`  # sub-assignment data.frame method

`dimnames<-`      # change dimname attribute

`attributes<-`    # change any attributes

其他二進制運算符也可以這樣調用:


`+`(1,2)  # 3

`-`(1,2)  # -1

`*`(1,2)  # 2

`/`(1,2)  # 0.5

既然您知道了,類似這樣的事情應該真的讓您大吃一驚:


Data <- data.frame(x=1:10, y=10:1)

names(Data)[1] <- "HI"              # How does that work?!? Magic! ;-)


查看完整回答
反對 回復 2019-10-06
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

之所以說是“魔術”,是因為“賦值”表格必須具有實際變量才能使用。而且factor(dat$product)沒有分配任何東西。


# This works since its done in several steps

x <- factor(dat$product)

levels(x) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)

x


# This doesn't work although it's the "same" thing:

levels(factor(dat$product)) <- list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)

# Error: could not find function "factor<-"


# and this is the magic work-around that does work

`levels<-`(

  factor(dat$product),

  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)

  )


查看完整回答
反對 回復 2019-10-06
  • 3 回答
  • 0 關注
  • 861 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號