你可以通過標準的評估和lazyeval
做到這一點,儘管它可能看起來像乍一看大量的工作,我不知道優雅適用。
想法是在lapply
循環中使用interp
來查看感興趣的後綴併爲每個匹配的變量對設置一個函數。
爲避免對後綴進行硬編碼,可以將它們從數據集中提取出來。這種情況適用於您的簡單情況,但如果您的真實數據更復雜,則可能需要更多考慮。
suffix = unique(sub(".*\\.", "", names(y)))
suffix
[1] "foo" "bar" "baz"
現在的循環,在interp
使得簡單的函數'+'(x, y)
(又名x + y
)。 x
和y
的變量通過paste
設置適當的後綴,全部包含在as.name
中。
dots = lapply(suffix,
function(suff) interp(~'+'(x, y),
x = as.name(paste("a", suff, sep = ".")),
y = as.name(paste("b", suff, sep = "."))))
dots
[[1]]
~a.foo + b.foo
<environment: 0x036bf4b8>
[[2]]
~a.bar + b.bar
<environment: 0x036c189c>
[[3]]
~a.baz + b.baz
<environment: 0x036c4c14>
然後,只需使用mutate_
與列表dots
來計算你的新變量。感興趣的樣子
mutate_(y, .dots = dots)
列:
a.foo + b.foo a.bar + b.bar a.baz + b.baz
1 -2.7750933 2.2524274 0.52665909
2 -1.6001349 0.7894692 -0.13340202
3 0.8031004 1.1632274 0.46272597
4 -0.9941492 1.4346315 -0.06327656
5 -1.7558620 1.4079703 -1.14218434
6 -0.6322581 -1.5661146 1.40710596
7 0.4077698 -2.9227982 1.33316137
8 -0.2664580 1.5139438 1.95130283
9 -0.4476210 -0.7926471 -0.44932288
10 -0.6217235 -1.2043056 -0.19059357
爲了得到你需要添加的setNames
使用,再次使用paste
來創建基於suffix
載體命名新名稱。
mutate_(y, .dots = setNames(dots, paste("z", suffix, sep = ".")))
新列:
z.foo z.bar z.baz
1 -2.7750933 2.2524274 0.52665909
2 -1.6001349 0.7894692 -0.13340202
3 0.8031004 1.1632274 0.46272597
4 -0.9941492 1.4346315 -0.06327656
5 -1.7558620 1.4079703 -1.14218434
6 -0.6322581 -1.5661146 1.40710596
7 0.4077698 -2.9227982 1.33316137
8 -0.2664580 1.5139438 1.95130283
9 -0.4476210 -0.7926471 -0.44932288
10 -0.6217235 -1.2043056 -0.19059357
在你的情況下,你可以在沒有任何包的情況下簡單地執行'y [c(T,F)] + y [c(F,T)]',但你的例子非常簡單。 –
是的,我在那裏有其他列,只是想在上面匹配正則表達式的對上應用這個二進制函數。 –