library(tidyverse)
df = data.frame(dates1 = c(20120631,NA,20130504,20161211),
dates2 = c(201604,201503,NA,201201))
sapply(df,function(x) x %>% na.omit %>% as.character %>% nchar==8 %>% all)
lapply(df,function(x) x %>% na.omit %>% as.character %>% nchar==8 %>% all)
sapply(df,function(x) x %>% na.omit %>% as.character %>% nchar==8 %>% any)
lapply(df,function(x) x %>% na.omit %>% as.character %>% nchar==8 %>% any)
如果我对这样任何线索sapply
及lapply
工作(我敢肯定这个工作昨天),这应该给我回单TRUE
或FALSE
。不是。我得到的是真与假矩阵。这不是什么any()
或all()
应该做的。
贴上结果:
dates1 dates2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
应用结果:
$dates1
[1] FALSE FALSE FALSE
$dates2
[1] FALSE FALSE FALSE
WTH正在进行吗?
首先请注意,代码的问题在于操作顺序。%>%
是在之前执行的,==
但是我们要==
在最后执行之前执行,%>%
因此请使用括号将其强制执行。实际上,不需要此处所示的最里面的括号,因为默认的操作顺序已经适用于这些括号。但是,除了为清晰起见而添加的内容之外,我们还添加了其他内容。有关?Syntax
提供操作顺序的完整表,请参见。
sapply(df,function(x) ((x %>% na.omit %>% as.character %>% nchar) == 8) %>% all)
## dates1 dates2
## TRUE FALSE
但是,使用以下事实可能会更好地编写为以下内容:
nchar
已经强迫其论证性格,因此我们可以消除 as.character
. %>% whatever
可以用来定义一个函数whatever
,假设单个参数是点(。),则将其替换为函数体{...}
可以用来防止自动。插入:给予:
df %>% sapply(. %>% na.omit %>% { nchar(.) == 8 } %>% all)
## dates1 dates2
## TRUE FALSE
或者如果需要在所有列上使用单个逻辑,则:
p <- df %>% sapply(na.omit) %>% { nchar(.) == 8 }
p %>% all
## [1] FALSE
p %>% any
## [1] TRUE
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句