我有一个看起来像这样的数据集:
data <- data.frame(place=c("Start", "B", "B", "A", "A", "Start", "A", "O", "A", "Start", "O", "A", "O"), ID=c(rep(1, 5), rep(2,4), rep(3,4)))
place ID
1 Start 1
2 B 1
3 B 1
4 A 1
5 A 1
6 Start 2
7 A 2
8 O 2
9 A 2
10 Start 3
11 O 3
12 A 3
13 O 3
我想计算每个group_by(ID)中有一个“ O”的次数。因此,ID 1具有零个O,ID 2具有一个“ O”,ID 3具有两个O。具有O的行的解决方案波纹管过滤器,因此我不会得到零计数。
下面的答案中的解决方案给出了以下输出:
ID place
1 2 1
2 3 2
但是我需要一个表,该表还显示ID 1的计数为零。我当然可以left_join原始ID,然后将其计数设置为零,但是必须有一个更简单的解决方案。
答案 0 :(得分:3)
不需要任何包装,只需
data [(data$place=="O"),]
它将给出切片的数据帧,行中仅包含O,然后对其进行汇总。或
aggregate(place ~ ID, data[data$place == "O", ], FUN = length)
您会得到答案
答案 1 :(得分:2)
带有data.table
软件包的解决方案
library(data.table)
dt <- as.data.table(data)
count_dt <- dt[place == "O", .N, by = ID]
count_df <- as.data.frame(count_dt)
count_df
答案 2 :(得分:1)
一种dplyr
解决方案是:
library(dplyr)
data %>%
group_by(ID) %>%
summarise(place = sum(place=="O"))