如何使用dplyr填充空数据框的默认值?

3

我运行了下面的代码,并得到了正确的输出。该代码计算myData数据框中Element列中"A"出现的次数:

  Element counted
1       A       4

以上输出的代码:

library(dplyr)

myData = data.frame(Element = c("A","A","C","A","B","B","A"),Class = c(0,0,0,0,1,1,2))

myData %>% 
  filter(Element == 'A') %>%
  count(Element, name = 'counted')

然而,我希望更改代码,使其在针对不存在的元素运行时返回计数为0的数据框。我需要这个功能用于一系列 ifelse(...)语句,这些语句会查看myData 数据框。因此,当针对不存在的元素 D 运行此代码时:

myData %>% 
  filter(Element == 'D') %>%
  count(Element, name = 'counted')

我想回到:

  Element counted
1       D       0

与当前代码生成的内容不同:

[1] Element counted
<0 rows> (or 0-length row.names)

在完整的代码中,D是未知的,属于元素A-C之外。我想对于任何在A-C之外的元素返回0。我希望在因子水平中不包括元素“D”来实现这一点。有没有一种简便的方法在dplyr中实现这个目标?
1个回答

4

Element转换为factor并给出所有想要的水平,然后在count()函数中设置.drop = FALSE

myData %>%
  mutate(Element = factor(Element, levels = c('A', 'B', 'C', 'D'))) %>%
  count(Element, .drop = FALSE)

#   Element n
# 1       A 4
# 2       B 2
# 3       C 1
# 4       D 0

更新

看起来你想检查一个元素是否包含在 Element 中。如果包含,则计算其数量;否则,打印 0。你可以在外部分配要检查的元素并使用以下代码:

x <- c('A', 'D')

myData %>%
  filter(Element %in% x) %>% 
  mutate(Element = factor(Element, levels = x)) %>%
  count(Element, .drop = FALSE)

#   Element n
# 1       A 4
# 2       D 0
附加说明

.drop 实际上是 group_by() 的一个参数。这一行代码:

%>% count(Element, .drop = FALSE)

相当于

%>% group_by(Element, .drop = FALSE) %>% tally()

在技术实现方面,tally也可以追溯到summarise(n = n())的内部细节。

1
谢谢,不过这需要将元素D放入因子水平中。在完整的代码中,D是一个未知量,落在A-C元素之外。我想对于任何A-C元素之外的元素返回0。有没有一种方法可以在不包括D在因子水平中的情况下完成这个操作,并且只返回我上面展示的Element = D和counted = 0的1行数据框?(我也不同意这是重复的,我会看看如何挑战它) - Curious Jorge - user9788072
1
@CuriousJorge-user9788072 我已经重新打开了您的问题,请在问题中添加评论以澄清您的请求。 - Darren Tsai
1
@CuriousJorge-user9788072 请查看我的更新。这是你想要的吗? - Darren Tsai
非常感谢!很好用。我还编辑了问题以澄清。 - Curious Jorge - user9788072

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接