Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带过滤器的dplyr自连接_R_Dplyr - Fatal编程技术网

带过滤器的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
是邪恶的。