gpt4 book ai didi

r - lapply 和 sapply 在 data.frame 上测试每列中的所有元素以获得单个逻辑

转载 作者:行者123 更新时间:2023-12-01 14:01:48 25 4
gpt4 key购买 nike

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)

如果我对 sapplylapply 的工作方式有任何线索(我很确定这昨天有效),这应该会给我一个 TRUEFALSE。它不是。我正在返回一个真与假的矩阵。这不是 any()all() 应该做的事情。

申请结果:

     dates1 dates2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE

重叠结果:

$dates1
[1] FALSE FALSE FALSE

$dates2
[1] FALSE FALSE FALSE

这是怎么回事?

最佳答案

首先请注意,代码的问题在于操作顺序。 %>%== 之前执行,但我们希望 == 在最后一个 %>% 之前执行,所以使用括号强制执行此操作。这里显示的最里面的括号实际上是不需要的,因为默认的操作顺序已经适用于这些;然而,除了为了清晰起见之外,我们还添加了它们。有关给出操作顺序的完整表格,请参阅?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

关于r - lapply 和 sapply 在 data.frame 上测试每列中的所有元素以获得单个逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51108288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com