R 为什么赢了';t管道操作符让我合并连续突变?

R 为什么赢了';t管道操作符让我合并连续突变?,r,multiple-columns,mutate,R,Multiple Columns,Mutate,我想从这个 …变成 当我做下面的事情时 villastats<-villastats%>% mutate(HG = ifelse(HomeTeam == "Aston Villa", villastats$FTHG, ifelse(HomeTeam != "Aston Villa", 0, 0))) villastats<-villastats%>% mutate(AG = ifelse(AwayTeam == &q

我想从这个

…变成

当我做下面的事情时

villastats<-villastats%>% 
  mutate(HG = ifelse(HomeTeam == "Aston Villa", villastats$FTHG, ifelse(HomeTeam != "Aston Villa", 0, 0)))
villastats<-villastats%>% 
  mutate(AG = ifelse(AwayTeam == "Aston Villa", villastats$FTAG, ifelse(AwayTeam != "Aston Villa", 0, 0)))
villastats<-villastats%>%
  mutate(THG=cumsum(villastats$HG))
villastats<-villastats%>%
  mutate(TAG=cumsum(villastats$AG))
villastats<-villastats%>%
  mutate(Tot=THG+TAG)
villastats%
变异(HG=ifelse(主队==“阿斯顿维拉”,维拉统计数据$FTHG,ifelse(主队!=“阿斯顿维拉”,0,0)))
维拉斯塔斯%
变异(AG=ifelse(AwayTeam==“阿斯顿别墅”,别墅统计$FTAG,ifelse(AwayTeam!=“阿斯顿别墅”,0,0)))
维拉斯塔斯%
突变(THG=cumsum(villastats$HG))
维拉斯塔斯%
突变(标签=cumsum(villastats$AG))
维拉斯塔斯%
突变(Tot=THG+TAG)
…它产生了我想要的上述结果。我想一次完成所有的突变,所以我尝试了

villastats<-villastats%>% 
  mutate(HG = ifelse(HomeTeam == "Aston Villa", villastats$FTHG, ifelse(HomeTeam != "Aston Villa", 0, 0)))%>%
  mutate(AG = ifelse(AwayTeam == "Aston Villa", villastats$FTAG, ifelse(AwayTeam != "Aston Villa", 0, 0)))%>%
  mutate(THG=cumsum(villastats$HG))
  mutate(TAG=cumsum(villastats$AG))%>%
  mutate(Tot=THG+TAG)
villastats%
变异(HG=ifelse(主队==“阿斯顿维拉”,维拉统计数据$FTHG,ifelse(主队!=“阿斯顿维拉”,0,0)))%>%
变异(AG=ifelse(AwayTeam==“阿斯顿别墅”,别墅统计$FTAG,ifelse(AwayTeam!=“阿斯顿别墅”,0,0)))%>%
突变(THG=cumsum(villastats$HG))
突变(TAG=cumsum(villastats$AG))%>%
突变(Tot=THG+TAG)
这不管用。前两行很好,但当我添加第三行时,它告诉我

错误:列
THG
的长度必须为38(行数)或1,而不是0
  • 当您在从对象
    villastats$
    派生的管道内使用
    villastats$
    时(如您所做),则
    villastats$$FTHG
    指管道中第一步之前的变量版本。比如说,

    someframe%#%#%
    变异(
    HG=ifelse(主队==“阿斯顿别墅”,FTHG,0),
    AG=ifelse(AwayTeam==“阿斯顿别墅”,FTAG,0),
    THG=总和(HG),
    标签=总和(AG),
    Tot=THG+标签
    )
    
  • 不是你问的,但我敦促用
    dplyr::if_else
    代替base
    ifelse
    。后者删除了一些类(例如try
    ifelse(TRUE,Sys.time(),Sys.time())
    ),并允许程序员在“yes”和“no”选项中包含不同的类对象,从而变得草率
    if_else
    不允许您执行
    if_else(TRUE,“1”、-3.14)
    ,因为它们是不同的。(它甚至会抱怨
    if_else(TRUE,0,0L)
    。这很严格。)使用它并声明,这意味着使用
    0L
    ,而不是
    0
    ,如果您希望您的正常操作是整数,等等


  • villstats%>%mutate(HG=ifelse(…)、AG=ifelse(…)、THG=cumsum(…)、TAG=cumsum(…)、Tot=THG+TAG)
    。并停止在调用mutate中使用
    villastats$
    。问题是您已经将
    villastats$
    放在
    HG
    AG
    之前<代码>villastats仅在管道的最后一步之后更新。在管道的中间<代码> VILASTATS 简单地引用原始数据集。不同的是,在流水线的中间没有代码<代码> HG和<代码> Ag<代码> >代码> VILASTATS < /代码>。因此,您会得到一个错误。请您使用
    dput(head(data))
    编辑您的问题以包含输出,而不是发布屏幕截图。人们无法从截图中重现您的错误。谢谢。感谢您的回答,但上述两个答案(2和3)都会导致>错误:列
    THG
    必须为38(行数)或1,不是0。我有一个旧版本的代码,刚刚修复,请检查。如果这不能解决问题,那么。。。我不知道。我正在编写没有数据的代码,所以我没有办法用数据来实际测试。也许我可以帮你解决问题,并粘贴
    dput(head(villastats,n))
    的输出,其中
    n
    足够大,足以显示数据中的变化,但不会太大,以致于问题太多。编辑后两种解决方案都有效。非常感谢。很高兴它成功了!当你确信它是可靠的(不要着急)时,请回来回答。谢谢