簡體   English   中英

在dplyr中使用變量列名稱(執行)

[英]using variable column names in dplyr (do)

我有以下示例數據

d.1 = data.frame(id=c(1,1,2,3,3), date=c(2001,2002,2001,2001,2003), measure=c(1:5))
d.2 = data.frame(id=c(1,2,2,3,3), date=c(2001,2002,2003,2002,2008), measure=c(1:5))
d = merge(d.1,d.2, all=T, by="id")

d.1d.2是兩種測量,每個id我需要每個測量之一。 測量值應盡可能接近。 我可以用dplyr

require(dplyr)
d = d %>%
    group_by(id) %>%
    do(.[which.min(abs(.$date.x-.$date.y)),])

問題是,如果日期列的名稱保存在像name.x="date.x"name.y="date.y"這樣的變量中,那么我將如何使用dplyr ,因為我無法使用

...
do(.[which.min(abs(.[, name.x]-.[, name.y])),])
....

我試圖使用evalas.symbol ans之類的東西找到另一個解決方案,但我找不到解決方案...

d$date.x返回一個向量,而d[, name.x]返回一個data.frame,當在函數內部傳遞該數據時不起作用。 因此,只需將訪問此列的方式更改為d[[name.x]] ,它將起作用:

d %>% group_by(id) %>% do(.[which.min(abs(.[[name.x]] -.[[name.y]])),])

從0.4(在回答該問題后立即發布)開始, dplyr包含了標准評估版do_ ,從理論do_ ,它應該比NSE版本更易於編程。

您可以類似地使用它:

interp <- lazyeval::interp
d %>% 
  group_by(id) %>%
  do_(interp(~ .[which.min(abs(.$x - .$y)), ],
             x = as.name(name.x), y = as.name(name.y)))

我不確定它比NSE版本更容易讀寫。 對於其他動詞, 代碼可以保持簡潔,同時也可以通過編程方式訪問名稱。

但是,對於do_ ,必須使用點代詞來訪問列名, 例如,如本問題所述 因此,我認為,你總是需要使用interpdo_ 這使得代碼比先前答案中的NSE版本更加冗長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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