带过滤器的dplyr自连接
我想从一个长格式数据框中的所有标记项中减去标签为“基线”的行中的值。使用带有“基线”子集的左联合,分两步很容易做到这一点。但是,我不知道如何将带过滤器的dplyr自连接,r,dplyr,R,Dplyr,我想从一个长格式数据框中的所有标记项中减去标签为“基线”的行中的值。使用带有“基线”子集的左联合,分两步很容易做到这一点。但是,我不知道如何将vas_1和vas_diff组合成一条链 library(dplyr) # Create test data n_users = 5 vas = data_frame( user = rep(letters[1:n_users], each = 3), group = rep(c("baseline", "early", "late" ),n_us
vas_1
和vas_diff
组合成一条链
library(dplyr)
# Create test data
n_users = 5
vas = data_frame(
user = rep(letters[1:n_users], each = 3),
group = rep(c("baseline", "early", "late" ),n_users),
vas = round(rgamma(n_users*3, 10,1.4 ))
)
# The above data are given
# Assume some other operations are required
vas_1 = vas %>%
mutate(
vas = vas * 2
)
# I want to put the following into one
# chain with the above
# Use self-join to subtract baseline
vas_diff = vas_1 %>%
filter(group != "baseline") %>%
# Problem is vas_1 here. Using . gives error here
# Adding copy = TRUE does not help
# left_join(. %>% filter(group == "baseline") , by = c("user")) %>%
left_join(vas_1 %>% filter(group == "baseline") , by = c("user")) %>%
mutate(vas = vas.x - vas.y) %>% # compute offset
select(user, group.x, vas) # remove temporary variables
vas_diff
当应多次使用
时,我使用匿名函数:
... %>% (function(df) { ... }) %>% ...
因此,在你的情况下:
vas_diff = vas_1 %>%
filter(group != "baseline") %>%
(function(df) left_join(df, df %>% filter(group == "baseline") , by = c("user"))) %>%
mutate(vas = vas.x - vas.y) %>% # compute offset
select(user, group.x, vas)
(这不会像上面评论中所描述的那样产生理想的结果,但您可以看到它展示了如何使用匿名函数)
但你可能想要这个:
vas_diff = vas_1 %>%
left_join(
x = filter(., group != "baseline")
, y = filter(., group == "baseline")
, by = c("user")
) %>%
mutate(vas = vas.x - vas.y) %>% # compute offset
select(user, group.x, vas) # remove temporary variables
这里有一个类似的选项和一个演示,您可以将整个管道链作为参数传递给连接。您可以将
作为参数传递给eval
,然后删除右侧不需要的列,而不是将
移动到过滤器中。这主要是为了我自己的目的记录这种方法
vas_diff = vas_1 %>%
left_join(x = eval(.) %>%
filter(group != "baseline"),
y = eval(.) %>%
filter(group == "baseline") %>%
select(-group),
by = c("user")) %>%
mutate(vas = vas.x - vas.y) %>% # compute offset
select(user, group, vas)
有人知道为什么不能简单地传递
,比如x=.%>%过滤器…
。为什么我们需要eval(.)
那么期望的结果是什么?你的代码可以工作。你只是想简化它,还是想要一个不同的结果?不,结果很好。我对dplyr的内部工作原理感兴趣,尤其是点的魔力。试图理解请求复制的错误消息,即使“复制”也失败我不太确定我是否理解您的问题,但问题似乎是您过滤掉了group==“baseline”
中的所有观察结果,然后,在管道中,您希望再次访问这些行,但它们不再在数据中。也许你想要像vas\u 1%>%left\u join(filter(,group!=“baseline”)、filter(,group==“baseline”)、by=c(“user”)
?@docendo discimus:这对我不起作用,因为left\u join
在%>%
上连接,并且在链中使用时只有一个参数。当我非常年轻漂亮的时候,我母亲告诉我,eval
是邪恶的。