在浏览网页和StackOverFlow之后,我找不到解决方案。我正在尝试计算“NumIDShowsInCol_1”列中数据框内没有聚合或分组功能的“ID”数字显示的次数。如果正确完成,最终结果仍将拥有100个观察值。如果使用聚合或分组功能,则结果列<100并且不与数据帧合并。下面是示例代码和显示所需结果的结果数据框的示例。
set.seed(123)
df <- data.frame(ID = sample(1:30, 100, replace = T),
TotalDays = sample(15:1000, 100, replace = T),
NumEnroll = sample(1:3, 100, replace = T),
NumIDShowsInCol_1 = sample(0, 100, replace = T))
Desired Outcome:
ID TotalDays NumEnroll NumIDShowsInCol_1
1 5 307 2 3
2 12 945 1 4
3 23 85 3 5
4 19 650 2 5
5 28 642 2 3
6 17 191 3 4
提前感谢您的帮助。
答案 0 :(得分:1)
事实上,您可以使用dplyr::group_by
来计算ID
并且不会丢失任何观察结果:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(NumIDShowsInCol_1 = n()) %>%
ungroup()
# A tibble: 100 x 4
ID TotalDays NumEnroll NumIDShowsInCol_1
<int> <int> <int> <int>
1 5 307 2 3
2 12 945 1 4
3 23 85 3 5
4 19 650 2 5
5 28 642 2 3
6 17 191 3 4
7 2 855 2 4
8 6 857 3 5
9 19 276 2 5
10 8 934 2 3
# ... with 90 more rows
答案 1 :(得分:0)
您必须与:=
包中的data.table
一起使用。
df <- data.frame(ID = sample(1:30, 100, replace = T),
TotalDays = sample(15:1000, 100, replace = T),
NumEnroll = sample(1:3, 100, replace = T),
NumIDShowsInCol_1 = sample(0, 100, replace = T))
library(data.table)
setDT(df)
df[,NumIDShowsInCol_1 := as.numeric(.N), ID]
df
您可以通过不预先生成NumIDShowsInCol_1
来改进您的示例,因此无需将.N
转换为数字。
df <- data.frame(ID = sample(1:30, 100, replace = T),
TotalDays = sample(15:1000, 100, replace = T),
NumEnroll = sample(1:3, 100, replace = T))
library(data.table)
setDT(df)
df[,NumIDShowsInCol_1 := .N, ID]
df