[英]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.1
和d.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])),])
....
我試圖使用eval
, as.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_
,必須使用點代詞來訪問列名, 例如,如本問題所述 。 因此,我認為,你總是需要使用interp
與do_
。 這使得代碼比先前答案中的NSE版本更加冗長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.