Data.frame允许使用进行列子集的操作[
,默认情况下将单个列/行的输出拖放到向量中。Dplyr故意不允许这样做(这似乎是因为编码绝对是一场噩梦)。
df <- data.frame(a = c(1:5,NA), b = c(1,1,1,2,2,2))
mean(df[,"a"], na.rm = T) # 3
dftbl <- as.tbl(df)
mean(dftbl[,"a"], na.rm = T) # NA
因此建议[[
将其作为子集,因为这将为dfs和tbl_dfs提供统一的输出。但是:这仅适用于列或行,但不适用于行+列,并且如果您不检查警告,就可以忽略这种差异(这是我自己的错),例如:
dfresult <- mean(df[df$b == 2, "a"], na.rm = T) # 4.5
tblresult <- mean(dftbl[dftbl$b == 2, "a"], na.rm = T) # NA_real_
是否有人对行子集执行列操作有任何“最佳实践”建议?这是我应该dplyr
使用filter
&改进我的游戏的地方select
吗?到目前为止,我的尝试一直在碰壁。感谢任何黄金法则。提前致谢。
dftbl %>% filter(b == 2) %>% select(a) %>% mean(na.rm = T) #NA
这以相同的方式失败,过滤后的选定数据STILL是一个N * 1小标题,拒绝与一起玩mean
。
dftbl %>% filter(b == 2) %>% select(a) %>% as.data.frame() %>% .$a
# [1] 4 5 NA
但
dftbl %>% filter(b == 2) %>% select(a) %>% as.data.frame() %>% mean(.$a, na.rm = T)
# [1] NA
究其原因,是因为我们需要[[
的,而不是[
与[
它仍然是一个tibble
有一列。的mean
期望输入作为vector
mean(dftbl[["a"]], na.rm = TRUE)
#[1] 3
或使用 $
mean(dftb$a, na.rm = TRUE)
关于第二种情况,select
还返回带有所选列的标题。相反,我们可以使用pull
提取为vector
dftbl[dftbl$b == 2, "a"] %>%
pull(1)
#[1] 4 5 NA
或者,如果我们不想加载任何库,请使用 unlist
mean(unlist(dftbl[dftbl$b == 2, "a"]), na.rm = TRUE)
#[1] 4.5
对于OP帖子中提到的代码
dftbl %>%
filter(b == 2) %>%
select(a) %>%
.$a %>%
mean(., na.rm = TRUE)
#[1] 4.5
或搭配 pull
dftbl %>%
filter(b == 2) %>%
pull(a) %>%
mean(na.rm = TRUE)
#[1] 4.5
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句