如何解决为什么管道操作员不让我合并连续的突变?
我想对此进行突变...
...进入...
当我执行以下操作时...
villastats<-villastats%>%
mutate(HG = ifelse(HomeTeam == "Aston Villa",villastats$FTHG,ifelse(HomeTeam != "Aston Villa",0)))
villastats<-villastats%>%
mutate(AG = ifelse(AwayTeam == "Aston Villa",villastats$FTAG,ifelse(AwayTeam != "Aston Villa",0)))
villastats<-villastats%>%
mutate(THG=cumsum(villastats$HG))
villastats<-villastats%>%
mutate(TAG=cumsum(villastats$AG))
villastats<-villastats%>%
mutate(Tot=THG+TAG)
...产生了上面想要的结果。我想一次做所有的变异,所以我尝试了
villastats<-villastats%>%
mutate(HG = ifelse(HomeTeam == "Aston Villa",0)))%>%
mutate(AG = ifelse(AwayTeam == "Aston Villa",0)))%>%
mutate(THG=cumsum(villastats$HG))
mutate(TAG=cumsum(villastats$AG))%>%
mutate(Tot=THG+TAG)
这不起作用。前两行工作正常,但是当我添加第三行时,它告诉我
错误:列
THG
的长度必须为38(行数)或1,而不是0
我要去哪里错了?为什么要这样做?
解决方法
-
当您在从对象
rrgut@DESKTOP-NQJ4S14 MINGW64 ~/Documents/Raymond/HelloWorld $ C:/Users/rrgut/AppData/Local/Programs/Python/Python39/python.exe c:\Users\rrgut\.vscode\extensions\ms-python.python-2020.9.114305\pythonFiles\pyvsc-run-isolated.py pip install -U autopep8 --user C:\Users\rrgut\AppData\Local\Programs\Python\Python39\python.exe: can't open file 'C:\Users\rrgut\Documents\Raymond\HelloWorld\Usersrrgut.vscodeextensionsms-python.python-2020.9.114305pythonFilespyvsc-run-isolated.py': [Errno 2] No such file or directory
派生的管道中使用villastats$
时(如您所做的那样),则villastats$
引用变量之前的变量版本管道中的第一步。例如,villastats$$FTHG
在一些较简单的magrittr管道中,这是“很好的”,因为变量的开头与引用时的版本没有什么不同。但是,如果行(
someframe <- data.frame(a = 1:3,b = 11:13) # <---------------------------\ someframe %>% | mutate(a = a + 1) %>% # <-------------------------------------\ | mutate(a = a + 2) %>% # <--- this 'a' is referring to --/ | mutate(a = someframe$a + 3) # <--- this 'someframe$a' is referring to --/
)较少,值(dplyr::filter
)不同或只是重新排序(mutate(a = a+2)
),则arrange
可能完全不同来自a
的em>。最好的情况是,您将得到一个错误,因为您所引用的向量的长度与您正在执行的操作不兼容。在最糟糕的情况下,它不会给您任何警告或错误,但您的所有计算都是默默地错误的。 -
您可以将所有
someframe$a
操作放在一个呼叫中,就像mutate
虽然您所做的没错,但它会变慢,甚至可能难以阅读。
-
您的
villastats %>% mutate( HG = ifelse(HomeTeam == "Aston Villa",FTHG,ifelse(HomeTeam != "Aston Villa",0)),AG = ifelse(AwayTeam == "Aston Villa",FTAG,ifelse(AwayTeam != "Aston Villa",THG = cumsum(HG),TAG = cumsum(AG),Tot = THG+TAG )
不必要地嵌套。第一个比较ifelse
和第二个比较HomeTeam=="AstonVilla"
是完全互补的,您可以将所有比较简化为HomeTeam!="AstonVilla"
-
不是您所问的,但我强烈要求
villastats %>% mutate( HG = ifelse(HomeTeam == "Aston Villa",0),Tot = THG + TAG )
代替基础dplyr::if_else
。后者删除一些类(例如,尝试使用ifelse
),并通过在“是”和“否”选项中包含不同的类对象,使程序员变得草率。ifelse(TRUE,Sys.time(),Sys.time())
不允许您执行if_else
,因为它们是不同的。 (它甚至会抱怨if_else(TRUE,"1",-3.14)
。这是严格的。)使用它并声明性地使用,这意味着如果希望正常操作是整数,则使用if_else(TRUE,0L)
而不是0L
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。